读取xml文件,实现JTree树形结构的构建(一)

2023-11-04

JTree是Swing的一个组件(树),一颗树由若干节点,通过层级关系组成。
在java中JTree的节点通过DefaultMutableTreeNode类创建,该类实现TreeNode接口。

目前我只会一点基础的应用
例如使用DefaultMutableTreeNode类构建树形结构。
下面是一个简单的demo,先来结果图,再看代码!
结果图:
在这里插入图片描述

代码:

public class ReadBook {
    JTree jTree;
    public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
        ReadBook readBook = new ReadBook();
        readBook.readXml();
        readBook.JFConstruct();

    }

    public void readXml() throws ParserConfigurationException, IOException, SAXException {
        //MyMutableTreeNode类是我继承的DefaultMutableTreeNode类,因为我要根据我自己的需求进行的扩展,所以编写了该类
        // 下面会给出MyMutableTreeNode类的代码
        //这个节点是自己创建的根节点,第一个参数表示节点的名称,第二个参数是节点的描述
        //一般情况下,使用者可以直接使用DefaultMutableTreeNode类进行节点对象的创建
//        DefaultMutableTreeNode root = new DefaultMutableTreeNode("data");
        MyMutableTreeNode root = new MyMutableTreeNode("data", "这个是根节点");
        //你自己的路径,即xml文件路径
        String path = "你自己的路径xxxxxxxxxx/xml/book.xml";


        // 创建解析器工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = factory.newDocumentBuilder();
        // 创建一个Document对象
        Document doc = db.parse(path);

        //去除xml文件中的转行符,如果不去除,在后面获取节点的时候,dom读取会多获得节点
        initDoc(doc);

        NodeList bookList = doc.getElementsByTagName("book");
        // 获取节点个数
        System.out.println("一共有" + bookList.getLength() + "本书");

        //在这儿可以创建一个节点的数组,即表示每本书的根节点,后面都添加到root根节点上
        MyMutableTreeNode[] secondaryRoot = new MyMutableTreeNode[bookList.getLength()];

        // 遍历每个book节点
        for (int i = 0; i < bookList.getLength(); i++) {
            System.out.println("*******************************");
            // 索引从零开始
            org.w3c.dom.Node book = bookList.item(i);

            secondaryRoot[i] = new MyMutableTreeNode("book" + i);
            root.add(secondaryRoot[i]);

            // 获取book节点所有属性集合
            org.w3c.dom.NamedNodeMap attrs = book.getAttributes();
            System.out.println("第" + (i + 1) + "本书共有" + attrs.getLength() + "属性");

            NodeList childNodes = book.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node item = childNodes.item(j);
                NodeList childNodes1 = item.getChildNodes();
                for (int k = 0; k < childNodes1.getLength(); k++) {
                    System.out.println(childNodes1.item(k).getNodeValue());
                    MyMutableTreeNode treeNode = new MyMutableTreeNode(childNodes1.item(k).getNodeValue());
                    secondaryRoot[i].add(treeNode);
                }
            }

        }
       jTree = new JTree(root);
//        TreeNode node = (TreeNode) jTree.getModel().getRoot();
        //展开所有节点
        expandAll(jTree, new TreePath(node), true);
    }


    private void initDoc(org.w3c.dom.Node node)//将doc中的所有\n节点去除,提高处理效率
    {
        short nodeType = node.getNodeType();

        org.w3c.dom.Node parent;
        switch (nodeType) {
            case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                break;
            case org.w3c.dom.Node.TEXT_NODE:
                if (node.getNodeValue().trim().equals("")) {
                    parent = node.getParentNode();
                    parent.removeChild(node);
                    node = parent;
                }
                break;
            case org.w3c.dom.Node.ELEMENT_NODE:
                break;
            default:
                break;
        }
        org.w3c.dom.Node child = node.getFirstChild();

        while (null != child) {
            initDoc(child);
            child = child.getNextSibling();

        }
    }


    public void JFConstruct(){
        JFrame f = new JFrame("TreeTest");
        Container contentPane = f.getContentPane();

        //创建的一个滚动条
        JScrollPane scrollPane = new JScrollPane();
        //创建的一个面板
        JPanel panel = new JPanel();

        //将面板和滚动条添加到JFrame f容器中
        contentPane.add(panel, BorderLayout.NORTH);
        contentPane.add(scrollPane, BorderLayout.CENTER);

        //给JTree添加一个滚动条,并添加到JFrame f容器中
        f.add(new JScrollPane(jTree));


        f.pack();
        f.setExtendedState(JFrame.MAXIMIZED_BOTH);
        f.setVisible(true);
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
 }

book.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book id="1">
        <name>冰与火之歌</name>
        <author>乔治马丁</author>
        <year>2014</year>
        <price>89</price>
    </book>
    <book id="2">
        <name>安徒生童话</name>
        <year>2004</year>
        <price>77</price>
        <language>English</language>
    </book>
</bookstore>

以上得到的结果叶子结点没有展开,可以通过添加下面的代码,来直接打开。注意要把对应的调用代码打开。
记得打开

 /********************************************
     * 展开所有树节点
     * @param tree 当前数
     * @param parent 父节点的路径
     * @param expand 是否展开 true为展开
     */
    private void expandAll(JTree tree, TreePath parent, boolean expand) {
        TreeNode node = (TreeNode) parent.getLastPathComponent();

        if (node.getChildCount() > 0) {
            for (Enumeration e = node.children(); e.hasMoreElements(); ) {
                TreeNode n = (TreeNode) e.nextElement();
                TreePath path = parent.pathByAddingChild(n);
                expandAll(tree, path, expand);
            }
        }
        if (expand) {
            tree.expandPath(parent);
        } else {
            tree.collapsePath(parent);
        }
    }

现在的效果图为:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取xml文件,实现JTree树形结构的构建(一) 的相关文章

  • XML 解析:格式良好的检查:未声明的实体

    我正在使用 SSMS 2008 但收到以下错误 你知道这意味着什么吗 Msg 9448 Level 16 State 1 Line 4 XML parsing line 1 character 89 well formed check un
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 反射找不到对象子类型

    我试图通过使用反射来获取包中的所有类 当我使用具体类的代码 本例中为 A 时 它可以工作并打印子类信息 B 扩展 A 因此它打印 B 信息 但是当我将它与对象类一起使用时 它不起作用 我该如何修复它 这段代码的工作原理 Reflection
  • 不使用 local-name() 或 name() 函数的 XPath

    我必须解析oprResult code使用 XPath 从下面的 XML 中获取 XPath 表达式 local name oprResult code 正在按预期工作 但是 我无法使用name or local name功能为 在我的解析
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 加密 JBoss 配置中的敏感信息

    JBoss 中的标准数据源配置要求数据库用户的用户名和密码位于 xxx ds xml 文件中 如果我将数据源定义为 c3p0 mbean 我会遇到同样的问题 是否有标准方法来加密用户和密码 保存密钥的好地方是什么 这当然也与 tomcat
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • 无法捆绑适用于 Mac 的 Java 应用程序 1.8

    我正在尝试将我的 Java 应用程序导出到 Mac 该应用程序基于编译器合规级别 1 7 我尝试了不同的方法来捆绑应用程序 1 日食 我可以用来在 Eclipse 上导出的最新 JVM 版本是 1 6 2 马文 看来Maven上也存在同样的
  • Android 中麦克风的后台访问

    是否可以通过 Android 手机上的后台应用程序 服务 持续监控麦克风 我想做的一些想法 不断聆听背景中的声音信号 收到 有趣的 音频信号后 执行一些网络操作 如果前台应用程序需要的话 后台应用程序必须能够智能地放弃对麦克风的访问 除非可
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • java.lang.IllegalStateException:驱动程序可执行文件的路径必须由 webdriver.chrome.driver 系统属性设置 - Similiar 不回答

    尝试学习 Selenium 我打开了类似的问题 但似乎没有任何帮助 我的代码 package seleniumPractice import org openqa selenium WebDriver import org openqa s
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐