首页 > 编程笔记 > Java笔记 阅读:11

Java JTree树形组件的用法(附带实例)

JTree 组件简称为树形组件,可以显示具有层次结构的数据。

树形组件中的数据表现形式为一层套一层,结构清晰明了,用户可以方便地了解数据之间的层次关系,从而很容易地找到相关数据。例如 Windows 系统的文件管理器就是一个典型的树形层次结构。

一个 JTree(树)对象并没有包含实际的数据,只提供数据的一个视图。树对象通过查询它的数据模型获得数据。树对象垂直显示它的数据,树中显示的每一行包含一项数据,称为节点。

每棵树有一个根节点,其他所有节点是它的子孙。默认情况下,树只显示根节点,但是可以设置默认显示方式。

一个节点可以拥有孩子也可以没有任何子孙。那些可以拥有孩子的节点被称为“分支节点”,而不能拥有孩子的节点为“叶子节点”。分支节点可以有任意多个孩子。通常,用户可以通过单击展开或者折叠分支节点,使得它的孩子可见或不可见。默认情况下,除了根节点以外的所有分支节点呈现折叠状态。

Java JTree 常用的构造方法如下:
下面通过一个简单的案例演示 JTree 的应用。

【实例 1】使用简单 TreeNode 模型创建一个树,当用户单击“添加节点”按钮时,为树添加一个分支。
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;

public class JTreeDemo extends JFrame {
    static int i = 0;
    // DefaultMutableTreeNode 是树结构中的通用节点
    DefaultMutableTreeNode root;
    DefaultMutableTreeNode child;
    DefaultMutableTreeNode chosen;
    JTree tree;
    DefaultTreeModel model; // 使用 TreeNodes 的简单树数据模型
    String[][] data = {
        { "财务部", "财务管理", "成本核算" },
        { "总经办", "档案管理", "行政事务" },
        { "工程部", "项目管理", "质检部" }
    };

    JTreeDemo() {
        this.setTitle("JTree 演示程序 ");
        Container contentPane = this.getContentPane();
        JPanel jPanel1 = new JPanel(new BorderLayout());
        // 创建根节点
        root = new DefaultMutableTreeNode("公司 ");
        // 建立以 root 为根的树
        tree = new JTree(root);
        // 将树添加至滚动窗格,同时将滚动窗格添加到 JPanel1 面板
        jPanel1.add(new JScrollPane(tree), BorderLayout.CENTER);
        // 返回提供数据的 TreeModel
        model = (DefaultTreeModel) tree.getModel();
        // 创建按钮
        JButton jButton1 = new JButton("添加节点 ");
        // 注册监听器
        jButton1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // 实现添加节点的功能
                if (i < data.length) {
                    // 使用内部类 Branch 的方法创建子节点 child
                    child = new Branch(data[i++]).node();
                    // 返回当前选择的第一个节点中的最后一个路径组件
                    chosen = (DefaultMutableTreeNode)
                        tree.getLastSelectedPathComponent();
                    // 如果返回值为 null,则令 chosen=root
                    if (chosen == null) {
                        chosen = root;
                    }
                    // 如果返回值不是 null,则在父节点 chosen 的子节点中的
                    // index 位置插入子节点 child
                    model.insertNodeInto(child, chosen, 0);
                }
            }
        });

        jButton1.setBackground(Color.blue);
        jButton1.setForeground(Color.white);
        JPanel jPanel2 = new JPanel();
        jPanel2.add(jButton1);
        jPanel1.add(jPanel2, BorderLayout.SOUTH);
        contentPane.add(jPanel1);
        this.setSize(300, 400);
        this.setLocation(400, 400);
        this.setVisible(true);
    }

    // 内部类 Branch 是一个工具类,用来获取一个字符串数组
    // 并为第一个字符串建立一个 DefaultMutableTreeNode 作为根
    // 数组中其余的字符串作为叶子
    class Branch {
        DefaultMutableTreeNode r;
        // 构造方法
        public Branch(String[] data) {
            r = new DefaultMutableTreeNode(data[0]);
            for (int i = 1; i < data.length; i++) {
                r.add(new DefaultMutableTreeNode(data[i]));
            }
        }
        // 返回分支的根节点
        public DefaultMutableTreeNode node() {
            return r;
        }
    }

    // 主方法
    public static void main(String args[]) {
        new JTreeDemo();
    }
}
程序执行结果如下图所示:


观察运行结果可以发现,此时树只有一个根节点(公司)。选中根节点,然后单击“添加节点”按钮后,再双击根节点,就可以发现根节点下面已经添加了一个分支(财务部),如下图所示:


按照同样的操作方法,可以为根节点添加第二个和第三个分支。这样就实现了动态创建一个树的功能。

在实际应用中,树的节点可以动态从数据库获取。还可以为树添加相应的事件监听程序,每当用户选择不同的节点时,程序可以做出相应的处理。

相关文章