简体   繁体   English

实现从 xml 文件读取 DefaultMutableTreeNode 的 JTree

[英]Implementing JTree where the DefaultMutableTreeNode is read from xml file

Is it possible to create at JTree without hardcoding every tree node but rather reading in from a xml file and getting the same output as following code will give:是否可以在 JTree 上创建而不对每个树节点进行硬编码,而是从 xml 文件中读取并获得相同的 output,如下代码将给出:

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();
    }

}

I want to produce the same result but without hardcoding every node by using this XML file I created:我想使用我创建的这个 XML 文件产生相同的结果,但不对每个节点进行硬编码:

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

If you serialize the tree with XMLEncoder you can produce something like the below.如果您使用XMLEncoder序列化树,您可以生成如下所示的内容。 By extension, you can edit it and then deserialize it.通过扩展,您可以编辑它然后反序列化它。 That can of course compress well as there's a lot of redundancy.这当然可以很好地压缩,因为有很多冗余。 Serialization would look like:序列化看起来像:

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

Producing:生产:

<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>

There are various XML tree representation you can parse an XML document into eg DOM, Xdm, JDOM and build your JTree recursively by recursively processing that XML tree, here is an example using Saxon HE and XdmNode eg有多种 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 is on Maven eg Saxon HE 在 Maven 上,例如

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

adds the current version 11.4 to your project.将当前版本 11.4 添加到您的项目中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM