实现从xml文件中读取DefaultMutableTreeNode的JTree



是否可以在不硬编码每个树节点的情况下在JTree上创建,而是从xml文件中读取并获得与以下代码相同的输出:

import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class test {
test() {
JFrame f = new JFrame("Swing");
DefaultMutableTreeNode life = new DefaultMutableTreeNode("Life");
DefaultMutableTreeNode plants = new DefaultMutableTreeNode("Plants");
DefaultMutableTreeNode animals = new DefaultMutableTreeNode("Animals");
DefaultMutableTreeNode cryptogamers = new DefaultMutableTreeNode("Cryptogamers");
DefaultMutableTreeNode mammals = new DefaultMutableTreeNode("Mammals");
JTree root = new JTree(life);
life.add(plants);
life.add(animals);
plants.add(cryptogamers);
animals.add(mammals);
f.setSize(200, 200);
f.add(root);
f.setVisible(true);
}
public static void main(String[] args) {
new test();
}
}

我希望生成相同的结果,但不使用我创建的XML文件对每个节点进行硬编码:

<Biosphere name="Life"> 
<Kingdom name="Plants"> 
<Division name="Cryptogamers"> 
</Division>
</Kingdom>
<Kingdom name="Animals"> 
<Division name="Mammals"> 
</Division>
</Kingdom>
</Biosphere>

如果用XMLEncoder序列化树,可以生成如下所示的内容。通过扩展,您可以编辑它,然后反序列化它。这当然可以很好地压缩,因为有很多冗余。序列化看起来像:

public void serialize(TreeModel model) {
try (XMLEncoder enc = new XMLEncoder(Files.newOutputStream(Path.of("tree.xml")))) {
enc.writeObject(model);
}
catch(IOException e) {
e.printStackTrace();    
}
}

生产:

<java version="18.0.2.1" class="java.beans.XMLDecoder">
<object class="javax.swing.tree.DefaultTreeModel">
<object class="javax.swing.tree.DefaultMutableTreeNode">
<void property="userObject">
<string>Life</string>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode">
<void property="userObject">
<string>Plants</string>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode">
<void property="userObject">
<string>Cryptogamers</string>
</void>
</object>
</void>
</object>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode">
<void property="userObject">
<string>Animals</string>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode">
<void property="userObject">
<string>Mammals</string>
</void>
</object>
</void>
</object>
</void>
</object>
</object>
</java>

有各种各样的XML树表示,你可以将XML文档解析成DOM, Xdm, JDOM,并通过递归处理XML树递归地构建你的JTree,这里有一个使用Saxon HE和XdmNode的例子,例如

import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.XdmNode;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import java.io.File;
public class Main {
Main(XdmNode inputDoc) {
JFrame f = new JFrame("Swing");
JTree root = new JTree(parseXdmTreeToSwingTree((XdmNode)inputDoc.children("*").iterator().next()));

f.setSize(200, 200);
f.add(root);
f.setVisible(true);
}
MutableTreeNode parseXdmTreeToSwingTree(XdmNode inputNode) {
DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode(inputNode.attribute("name"));
for (XdmNode child : inputNode.children( "*"))
treeNode.add(parseXdmTreeToSwingTree(child));
return treeNode;
}
public static void main(String[] args) throws SaxonApiException {
Processor processor = new Processor(true);
XdmNode inputDoc = processor.newDocumentBuilder().build(new File("sample1.xml"));
new Main(inputDoc);
}
}

Saxon HE在Maven上,例如

<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
<version>11.4</version>
</dependency>

将当前版本11.4添加到项目中。

相关内容

  • 没有找到相关文章

最新更新