【问题标题】:Implementing JTree where the DefaultMutableTreeNode is read from xml file实现从 xml 文件读取 DefaultMutableTreeNode 的 JTree
【发布时间】:2022-11-26 21:26:39
【问题描述】:

是否可以在 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>

【问题讨论】:

    标签: java xml tree jframe jtree


    【解决方案1】:

    如果您使用 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>
    

    【讨论】:

    • 看起来g8。但我不确定下一步该怎么做。你有什么我可以效仿的例子吗?
    • 见上文 - 你应该能够反序列化看到这个例子
    • 我应该传入的三个模型是什么?
    【解决方案2】:

    有多种 XML 树表示,您可以将 XML 文档解析为例如DOM、Xdm、JDOM 并通过递归处理该 XML 树来递归构建 JTree,这里是一个使用 Saxon HE 和 XdmNode 的示例,例如

    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 添加到您的项目中。

    【讨论】:

    • 你能展示所有的进口商品吗?我收到很多错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多