Java JTree树形组件的用法(附带实例)
JTree 组件简称为树形组件,可以显示具有层次结构的数据。
树形组件中的数据表现形式为一层套一层,结构清晰明了,用户可以方便地了解数据之间的层次关系,从而很容易地找到相关数据。例如 Windows 系统的文件管理器就是一个典型的树形层次结构。
一个 JTree(树)对象并没有包含实际的数据,只提供数据的一个视图。树对象通过查询它的数据模型获得数据。树对象垂直显示它的数据,树中显示的每一行包含一项数据,称为节点。
每棵树有一个根节点,其他所有节点是它的子孙。默认情况下,树只显示根节点,但是可以设置默认显示方式。
一个节点可以拥有孩子也可以没有任何子孙。那些可以拥有孩子的节点被称为“分支节点”,而不能拥有孩子的节点为“叶子节点”。分支节点可以有任意多个孩子。通常,用户可以通过单击展开或者折叠分支节点,使得它的孩子可见或不可见。默认情况下,除了根节点以外的所有分支节点呈现折叠状态。
Java JTree 常用的构造方法如下:
下面通过一个简单的案例演示 JTree 的应用。
【实例 1】使用简单 TreeNode 模型创建一个树,当用户单击“添加节点”按钮时,为树添加一个分支。
观察运行结果可以发现,此时树只有一个根节点(公司)。选中根节点,然后单击“添加节点”按钮后,再双击根节点,就可以发现根节点下面已经添加了一个分支(财务部),如下图所示:
按照同样的操作方法,可以为根节点添加第二个和第三个分支。这样就实现了动态创建一个树的功能。
在实际应用中,树的节点可以动态从数据库获取。还可以为树添加相应的事件监听程序,每当用户选择不同的节点时,程序可以做出相应的处理。
树形组件中的数据表现形式为一层套一层,结构清晰明了,用户可以方便地了解数据之间的层次关系,从而很容易地找到相关数据。例如 Windows 系统的文件管理器就是一个典型的树形层次结构。
一个 JTree(树)对象并没有包含实际的数据,只提供数据的一个视图。树对象通过查询它的数据模型获得数据。树对象垂直显示它的数据,树中显示的每一行包含一项数据,称为节点。
每棵树有一个根节点,其他所有节点是它的子孙。默认情况下,树只显示根节点,但是可以设置默认显示方式。
一个节点可以拥有孩子也可以没有任何子孙。那些可以拥有孩子的节点被称为“分支节点”,而不能拥有孩子的节点为“叶子节点”。分支节点可以有任意多个孩子。通常,用户可以通过单击展开或者折叠分支节点,使得它的孩子可见或不可见。默认情况下,除了根节点以外的所有分支节点呈现折叠状态。
Java JTree 常用的构造方法如下:
- JTree():建立一棵带有示例模型的 JTree;
- JTree(Hashtable<?,?> value):返回从 HashTable 创建的 JTree,不显示根;
- JTree(Object[] value):返回 JTree,指定数组的每个元素作为不被显示的新根节点的子节点;
- JTree(TreeModel newModel):返回 JTree 的一个实例,使用指定的数据模型,显示根节点;
- Tree(TreeNode root):返回 JTree,指定 TreeNode 作为其根,显示根节点;
- JTree(TreeNode root, Boolean asksAllowsChildren):返回 JTree,指定 TreeNode 作为其根。它用指定的方式显示根节点,并确定节点是否为叶节点;
- JTree(Vector<?> value):返回 JTree,指定 Vector 的每个元素作为不被显示的新根节点的子节点。
下面通过一个简单的案例演示 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(); } }程序执行结果如下图所示:

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

按照同样的操作方法,可以为根节点添加第二个和第三个分支。这样就实现了动态创建一个树的功能。
在实际应用中,树的节点可以动态从数据库获取。还可以为树添加相应的事件监听程序,每当用户选择不同的节点时,程序可以做出相应的处理。