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

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