是否可以在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>发布于 2022-11-26 12:56:11
如果使用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>发布于 2022-11-26 13:13:01
有多种XML树表示形式,您可以将XML文档解析为DOM、Xdm、JDOM,并通过递归处理该XML树递归构建JTree。
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);
}
}萨克森他在Maven。
<dependency>
<groupId>net.sf.saxon</groupId>
<artifactId>Saxon-HE</artifactId>
<version>11.4</version>
</dependency>将当前版本11.4添加到项目中。
https://stackoverflow.com/questions/74582130
复制相似问题