用XML文件的方式,具体我没有做过,所以也没法说得很具体:)
就是类似于
<node>
<name>node1</name>
<child>node11</child>
<child>node12</child>
</node>
<node>
...
</node>
...
就是类似于
<node>
<name>node1</name>
<child>node11</child>
<child>node12</child>
</node>
<node>
...
</node>
...
http://expert.csdn.net/Expert/topic/1582/1582732.xml?temp=.2382929谢谢。
展开的时候读取状态信息,来判断节点是否展开就可以了
"放到文件中又怕别人通过文件乱改"-“所以我用Hashtable来作为系列化保存”
那你不还是保存在文件中了吗?不过不是文本文件罢了。参考一下下面的代码,不知对你有没有帮助————————————
public class XMLTree extends JTree{
private DefaultMutableTreeNode treeNode; //JTree的根节点
private DocumentBuilderFactory dbf;
// 这三个成员变量是xml parser需要的
private DocumentBuilder db;
private Document doc;
//
XMLTree(String fileName){
dbf = DocumentBuilderFactory.newInstance();
//生成dbf的实例
db = dbf.newDocumentBuilder();
//生成db的实例
treeNode = LoadFile( getXMLRoot( "text" ) );
//解析该xml文件,返回JTree的根节点
setModel( new DefaultTreeModel( treeNode ) );
//根据该根节点生成JTree
}
public void SaveToFile(DefaultMutableTreeNode root, FileWriter fw)
{
try
{
if (root.isLeaf())
fw.write(root.toString()+"\r\n");
//如果是叶子节点则直接将该节点输出到文件中
else
{
//不是叶子节点的话递归输出该节点
fw.write("<"+root.toString()+">\r\n");
for (int i=0; i < root.getChildCount(); i++)
{
DefaultMutableTreeNode childNode =(DefaultMutableTreeNode)root.getChildAt(i);
saveFile(childNode, fw);
//递归输出该节点的所有子节点
}
fw.write("</"+root.toString()+">\r\n");
}
}
catch(Exception e)
{
e.printStackTrace();
}
}
private Node getXMLRoot(String text)
{
ByteArrayInputStream byteStream;
byteStream = new ByteArrayInputStream(text.getBytes());
//将XML文件读到Stream里去
try{
doc = db.parse( byteStream );
//解析该xml文件。
}
catch( Exception e )
{
e.printStackTrace();
}
return ( Node )doc.getDocumentElement();
//返回该XML文件的DOM树的根元素
} }
你好 你能有空帮帮我吗?你能帮我看看我的问题吗? (也是关于树的。我想你一定能解答 )
http://expert.csdn.net/Expert/topic/1582/1582732.xml?temp=.2382929谢谢。
JTree是一个树型结构,而XML也是一种树型结构,两者有非常好的对应关系.
尤其是当你用DOM来处理XML时,它首先生成的就是一棵XML树.
对JTree的处理中最重要的是要使用递归算法,因为多数时候你不知道树有几层.
1.存储.
因为XML实际上是纯文本文件,只要准备好一个String,再将其写入就可以了。
写入:
PrintWriter out = new PrintWriter(new FileWriter(chooser.getSelectedFile()));
out.print(mTree.toXmlFromTree());
生成字符串:
public String toXmlFromTree() {
return toXmlFromNode(treeRoot);
}
下面是一个递规程序:
public String toXmlFromNode(DefaultMutableTreeNode node)『
StringBuffer sb = new StringBuffer();
sb.append("Something for this node, <node1>.... ");
for (int i = 0; i < node.getChildCount(); i++) {
if ((node.getChildAt(i))).getUserObject() [is a leaf]) { //leaf, break the recursion
sb.append("something about this node");
}
if ((node.getChildAt(i))).getUserObject() [not a leaf]) {
sb.append(toXmlFromNode((DefaultMutableTreeNode) node.getChildAt(i))); //non-leaf, recursion
}
}
sb.append("</node1>\n");
return sb.toString();
}
2.从XML文件中读入,并恢复这棵树。
(1)parse XML file
public static Document ParseXmlByDomFromFile(File docFile) {
Document doc = null;
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(docFile);
} catch (Exception e) {
System.out.print("Problem parsing the file.");
} Element root = doc.getDocumentElement(); return doc;
}
(2) convert the doc to your JTree
public static void convertXmlToMyModel(Document doc, YourType root) {
convertXmlToMyModelFromElementRoot(doc.getDocumentElement(), root);
}
下面是一个递规程序:
private static void convertXmlToMyModelFromElementRoot(Element elementroot, FeatureGroup featureroot) {
Node n = elementroot.getElementsByTagName("groupname").item(0).getFirstChild();
//do something for current node
for (int i = 0; i < ChildList.getLength(); i++) {
if (ChildList.item(i).getNodeName() == "node") { //for leaf in the XML tree
//add it to the JTree
}
if (ChildList.item(i).getNodeName() == "group") { //for non-leaf
convertXmlToMyModelFromElementRoot(((Element) (ChildList.item(i))), fg);//递规
//add it to the JTree
}
}
}你如果不熟悉XML,可以参考这里的教程:
http://developerlife.com/