深入了解Swing的JTree组件
立即解锁
发布时间: 2025-08-19 02:11:55 阅读量: 2 订阅数: 11 


Java编程核心与应用实践
### 深入了解 Swing 的 JTree 组件
#### 1. JTree 基础术语
在使用 JTree 之前,我们需要了解一些描述树的不同部分及其行为的术语。
- **节点(Node)**:树中显示的每个项目都称为一个节点。每个 JTree 都有一个位于节点层次结构顶部的根节点。
- **分支节点(Branch Node)和叶节点(Leaf Node)**:这两个术语的含义可能有所不同。叶节点可以指不包含其他节点的节点,也可以指不能包含其他节点的节点;分支节点可以指包含其他节点的节点,也可以指能够包含其他节点的节点。
- **父子关系**:当一个分支节点包含其他节点时,它被称为这些节点的父节点,而这些节点则是该分支的子节点,并且它们彼此是兄弟节点。一个节点可以既是父节点又是子节点。
- **后代和祖先**:一个分支节点直接或间接包含的所有节点都称为该分支的后代,而该分支本身则是其后代的祖先。
- **子树(Subtree)**:一个树节点及其所有后代构成一个子树。
- **展开和折叠**:JTree 组件通常允许父节点以两种状态显示:子节点可见(展开状态)或子节点隐藏(折叠状态)。可以通过点击节点左侧的小图标(句柄)来切换节点的展开和折叠状态。
#### 2. 节点的可见性
- **可查看节点(Viewable Node)**:当一个节点的所有祖先节点都展开时,该节点被认为是可查看的,但这并不意味着它当前是可见的。
- **显示节点(Displayed Node)**:只有当一个节点实际可见时,才被认为是显示的,即该节点位于 JScrollPane 当前可见的树部分内。
#### 3. 创建 JTree 实例
创建 JTree 实例非常简单,Java 提供了多种构造函数:
- **无参构造函数**:使用无参构造函数创建的 JTree 会填充一些虚拟数据。
- **接受对象数组、Vector 或 Hashtable 的构造函数**:可以将这些数据结构传递给构造函数来创建 JTree。
以下是一个创建 JTree 的示例代码:
```java
import javax.swing.*;
public class SimpleTreeTest extends JFrame {
public static void main(String[] args) {
SimpleTreeTest stt = new SimpleTreeTest();
stt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
stt.setSize(250, 250);
stt.setVisible(true);
}
public SimpleTreeTest() {
Object[] genealogy = {"Jeff", "Joseph", "Pearl", "Owen", "Sarah", "John"};
JTree tree = new JTree(genealogy);
JScrollPane jsp = new JScrollPane(tree);
getContentPane().add(jsp);
}
}
```
在这个例子中,构造函数创建的 JTree 有一个隐藏的根节点,数组中的每个对象都是这个不可见根节点的子节点。如果要显示根节点,可以调用 `setRootVisible(true)` 方法。
#### 4. 复杂树结构的创建
可以通过修改代码来创建更复杂的树结构。例如,将数组的一个元素替换为另一个数组:
```java
public SimpleTreeTest() {
Object[] genealogy = {"Jeff", "Joseph", "Pearl", "Owen", "Sarah", "John"};
genealogy[0] = new Object[] {"Jerry", "Selma", "Joe", "Evelyn"};
JTree tree = new JTree(genealogy);
tree.setRootVisible(true);
JScrollPane jsp = new JScrollPane(tree);
getContentPane().add(jsp);
}
```
不过,这种方法可能会导致显示的节点标签不明确。可以通过使用 Vector 或 Hashtable 并重写 `toString()` 方法来解决这个问题:
```java
public SimpleTreeTest() {
Object[] genealogy = {"Jeff", "Joseph", "Pearl", "Owen", "Sarah", "John"};
java.util.Vector v = new java.util.Vector() {
public String toString() {
return "Jeff";
}
};
v.addElement("Jerry");
v.addElement("Selma");
v.addElement("Joe");
v.addElement("Evelyn");
genealogy[0] = v;
JTree tree = new JTree(genealogy);
tree.setRootVisible(true);
JScrollPane jsp = new JScrollPane(tree);
getContentPane().add(jsp);
}
```
需要注意的是,重写集合的 `toString()` 方法通常不是一个好的编程实践。
#### 5. TreeModel 接口
与其他 Swing 组件一样,JTree 类的实例代表组件视图,而另一个对象代表模型。要成为 JTree 的模型,类必须实现 `TreeModel` 接口,该接口定义了 JTree 用于检索显示数据的方法:
| 方法 | 描述 |
| ---- | ---- |
| `addTreeModelListener()` | 用于添加监听器,当树数据发生变化时通知监听器 |
| `removeTreeModelListener()` | 用于移除监听器 |
| `getRoot()` | 返回树的根节点对象 |
| `getChildCount()` | 返回指定节点的子节点数量 |
| `getChild()` | 根据索引返回指定节点的子节点 |
| `getIndexOfChild()` | 返回指定子节点在其父节点子节点列表中的索引 |
| `isLeaf()` | 判断指定节点是否为叶节点 |
| `valueForPathChanged()` | 当节点的值发生变化时
0
0
复制全文
相关推荐










