JavaSwing中JTree组件的深入解析与应用
立即解锁
发布时间: 2025-08-18 00:08:26 阅读量: 2 订阅数: 9 

### Java Swing 中 JTree 组件的深入解析与应用
#### 1. 引言
在计算机编程中,树形结构是一种常见且重要的数据组织形式。无论是文件系统的目录结构,还是类的继承关系,都可以用树形结构来表示。在 Java 的 Swing 库中,提供了 `JTree` 类来方便我们展示和操作树形结构数据。本文将详细介绍 `JTree` 类的使用方法,包括简单树的创建、树的编辑、节点枚举、节点渲染以及自定义树模型等方面。
#### 2. 树形结构基础术语
在深入了解 `JTree` 之前,我们先明确一些树形结构的基础术语:
- **节点(Node)**:树的基本组成单元,可以是叶子节点(没有子节点)或非叶子节点(有子节点)。
- **根节点(Root Node)**:树中唯一没有父节点的节点。
- **父节点(Parent Node)**:除根节点外,每个节点都有一个父节点。
- **子节点(Child Node)**:一个节点可以有零个或多个子节点。
- **森林(Forest)**:由多个树组成的集合,每个树都有自己的根节点。
#### 3. 简单树的创建
`JTree` 组件遵循模型/视图/控制器(MVC)模式,我们需要提供一个树形数据模型,组件会将其显示出来。创建简单树的步骤如下:
1. **获取树模型**:可以通过实现 `TreeModel` 接口来创建自己的模型,也可以使用 Swing 库提供的 `DefaultTreeModel`。
2. **创建根节点**:使用 `DefaultMutableTreeNode` 类创建根节点。
3. **添加子节点**:使用 `add` 方法将子节点添加到父节点上。
4. **创建树模型**:使用根节点创建 `DefaultTreeModel`。
5. **创建 JTree**:使用树模型创建 `JTree`。
以下是一个简单树的示例代码:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
/**
* This program shows a simple tree.
*/
public class SimpleTree {
public static void main(String[] args) {
JFrame frame = new SimpleTreeFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
* This frame contains a simple tree that displays a manually constructed tree model.
*/
class SimpleTreeFrame extends JFrame {
public SimpleTreeFrame() {
setTitle("SimpleTree");
setSize(300, 200);
// set up tree model data
DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");
DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");
root.add(country);
DefaultMutableTreeNode state = new DefaultMutableTreeNode("California");
country.add(state);
DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose");
state.add(city);
city = new DefaultMutableTreeNode("Cupertino");
state.add(city);
state = new DefaultMutableTreeNode("Michigan");
country.add(state);
city = new DefaultMutableTreeNode("Ann Arbor");
state.add(city);
country = new DefaultMutableTreeNode("Germany");
root.add(country);
state = new DefaultMutableTreeNode("Schleswig-Holstein");
country.add(state);
city = new DefaultMutableTreeNode("Kiel");
state.add(city);
// construct tree and put it in a scroll pane
JTree tree = new JTree(root);
Container contentPane = getContentPane();
contentPane.add(new JScrollPane(tree));
}
private static final int WIDTH = 300;
private static final int HEIGHT = 200;
}
```
这个示例创建了一个简单的树,展示了世界、国家、州和城市的层次关系。
#### 4. 树的显示设置
树的显示效果可以通过一些方法进行设置,例如:
- **线条样式**:可以使用 `putClientProperty` 方法设置树的线条样式,有 "Angled"、"None" 和 "Horizontal" 三种可选。
```java
tree.putClientProperty("JTree.lineStyle", "Angled");
```
- **根节点处理**:可以使用 `setShowsRootHandles` 方法为根节点添加折叠/展开的手柄,使用 `setRootVisible` 方法隐藏根节点。
```java
tree.setShowsRootHandles(true);
tree.setRootVisible(false);
```
- **叶子节点图标**:树的节点默认使用不同的图标来区分叶子节点和非叶子节点。可以通过设置节点的 `isLeaf` 方法返回值或使用 `setAsksAllowsChildren` 方法来控制节点的叶子属性。
```java
node.setAllowsChildren(false);
model.setAsksAllowsChildren(true);
```
#### 5. 树的编辑与树路径
在某些情况下,我们需要对树进行编辑操作,例如添加、删除节点等。`JTree` 类使用树路径(`TreePath`)来标识节点,而不是直接使用节点对象。树路径是从根节点到目标节点的一系列节点组成的路径。
获取当前选中节点的步骤如下:
1. 使用 `getSelectionPath` 方法获取当前选中节点的树路径。
2. 使用 `getLastPathComponent` 方法获取树路径的最后一个节点。
```java
TreePath selectionPath = tree.getSelectionPath();
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
```
对树进行编辑时,需要注意使用 `DefaultTreeModel` 类的相应方法来确保视图能够正确更新。例如,使用 `insertNodeInto` 方法插入新节点,使用 `removeNodeFromParent` 方法删除节点。
```java
model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());
model.removeNodeFromParent(selectedNode);
```
编辑节点后,为了确保新节点可见,可以使用 `makeVisible` 或 `scrollPathToVisible` 方法。
```java
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.scrollPathToVisible(path);
```
以下是一个树编辑的示例代码:
```java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
/**
* This program demonstrates tree editing.
*/
public class TreeEditTest {
public static void main(String[] args) {
JFrame frame = new TreeEditFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
/**
* A frame with a tree and buttons to edit the tree.
*/
class TreeEditFrame extends JFrame {
public TreeEditFrame() {
setTitle("TreeEditTest");
setSize(400, 200);
// construct tree
TreeNode root = makeSampleTree();
DefaultTreeModel model = new DefaultTreeModel(root);
JTree tree = new JTree(model);
tree.setEditable(true);
// add scroll pane with tree to content pane
JScrollPane scrollPane = new JScrollPane(tree);
getContentPane().add(scrollPane, BorderLayout.CENTER);
makeButtons();
}
public TreeNode makeSampleTree() {
DefaultMutableTreeNode root = new DefaultMutableTreeNode("World");
DefaultMutableTreeNode country = new DefaultMutableTreeNode("USA");
root.add(country);
DefaultMutableTreeNode state = new DefaultMutableTreeNode("California");
country.add(state);
DefaultMutableTreeNode city = new DefaultMutableTreeNode("San Jose");
state.add(city);
city = new DefaultMutableTreeNode("Cupertino");
state.add(city);
state = new DefaultMutableTreeNode("Michigan");
country.add(state);
city = new DefaultMutableTreeNode("Ann Arbor");
state.add(city);
country = new DefaultMutableTreeNode("Germany");
root.add(country);
state = new DefaultMutableTreeNode("Schleswig-Holstein");
country.add(state);
city = new DefaultMutableTreeNode("Kiel");
state.add(city);
return root;
}
/**
* Makes the buttons to add a sibling, add a child, and delete a node.
*/
public void makeButtons() {
JPanel panel = new JPanel();
JButton addSiblingButton = new JButton("Add Sibling");
addSiblingButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if (selectedNode == null) return;
DefaultMutableTreeNode parent = (DefaultMutableTreeNode) selectedNode.getParent();
if (parent == null) return;
DefaultMu
```
0
0
复制全文
相关推荐










