JavaSwingJTree使用与剪切粘贴功能详解
立即解锁
发布时间: 2025-08-19 02:11:56 阅读量: 2 订阅数: 12 


Java编程核心与应用实践
### Java Swing JTree使用与剪切粘贴功能详解
#### 1. JTree节点连线样式设置
在Java中,JTree的节点连线样式在不同的外观风格下有所不同。Java外观风格默认不会在节点间绘制连线,但可以通过`putClientProperty()`方法修改`JTree.lineStyle`属性来改变这种行为。该属性有三种可选样式:
- `None`:默认样式,不绘制连线。
- `Angled`:在父节点和子节点间绘制斜线。
- `Horizontal`:在有子节点的节点上方绘制横线。
示例代码如下:
```java
JTree myTree = new JTree();
myTree.putClientProperty("JTree.lineStyle", "Angled");
```
需要注意的是,这种修改连线样式的方法仅适用于Java/Metal外观风格,对于Motif或Windows外观风格无效。
#### 2. JTree节点选择
许多应用程序允许用户在JTree中选择一个或多个节点以执行特定操作。在JTree中进行节点选择非常简单,只需将光标移到要选择的节点上并按下鼠标左键即可。`DefaultTreeCellRenderer`会通过不同颜色突出显示选中的节点。
JTree节点的选择由`TreeSelectionModel`的实现类控制,默认使用`DefaultTreeSelectionModel`。虽然可以创建自定义的选择模型实现,但由于`DefaultTreeSelectionModel`已经很灵活,所以很少有必要这么做。可以使用`setSelectionModel()`和`getSelectionModel()`方法来指定或获取当前使用的选择模型。如果要禁止选择任何节点,可将`null`传递给`setSelectionModel()`方法,示例代码如下:
```java
JTree myTree = new JTree();
// 禁止用户选择树中的节点
myTree.setSelectionModel(null);
```
##### 2.1 选择模式
`TreeSelectionModel`支持三种选择模式,每种模式由该接口中定义的常量表示:
| 选择模式 | 描述 |
| ---- | ---- |
| `SINGLE_TREE_SELECTION` | 同一时间只能选择一个节点,每次选择新节点时,之前选中的节点会被取消选择。 |
| `CONTIGUOUS_TREE_SELECTION` | 允许定义一个连续的节点范围,该范围内的所有节点都会被选中。 |
| `DISCONTIGUOUS_TREE_SELECTION` | 默认模式,对可选择的节点数量和位置没有限制,树中的任意一组节点都可以随时被选中。 |
设置选择模式的示例代码如下:
```java
JTree myTree = new JTree();
TreeSelectionModel model = myTree.getSelectionModel();
model.setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
```
以选择从“February”到“October”的节点为例,有两种选择连续节点的方法:
- 按住`Ctrl`键并分别点击每个节点。
- 先点击“February”节点,然后按住`Shift`键并点击“October”节点,这样就可以快速选中所需范围的节点。其中,“February”节点称为锚点选择,“October”节点称为引导选择。
需要注意的是:
- 选择分支节点(如“colors”、“sports”或“food”节点)不会导致其子节点被选中。
- 鼠标发起的选择操作仅适用于可见节点,即所有祖先节点都已展开的节点。
#### 3. 节点选择监听器
有时候需要在树的选择状态发生变化时得到通知,可以通过创建`TreeSelectionListener`实例并将其注册到JTree来实现。该接口定义了一个`valueChanged()`方法,当一个或多个节点的选择状态发生变化时会调用该方法。示例代码如下:
```java
import javax.swing.event.*;
// ...
JTree myTree = new JTree();
myTree.addTreeSelectionListener(new TreeSelectionListener() {
public void valueChanged(TreeSelectionEvent event) {
// 在此添加处理选择变化的代码
}
});
```
#### 4. 选择事件相关方法
`TreeSelectionEvent`类提供了一些方法,用于获取有关选择变化的信息和确定哪些节点参与了变化:
- `getPaths()`:返回一个`TreePath`对象数组,每个对象标识一个经历了选择状态变化的节点。
- `getPath()`:返回单个`TreePath`对象,在使用`SINGLE_TREE_SELECTION`模式且只需要获取单个`TreePath`对象时使用。如果使用其他选择模式,该方法返回`getPaths()`方法提供的数组中的第一个路径。
- `isAddedPath()`:这是一个重载方法,有三种实现方式,用于判断某个特定节点/路径是否被选中。
- `getNewLeadSelectionPath()`和`getOldLeadSelectionPath()`:分别返回表示新(选择状态变化后)和旧(选择状态变化前)引导选择路径的`TreeNode`引用,在大多数情况下,应用程序不需要关注这些路径。
#### 5. JTree选择方法
除了上述用于识别选择变化的方法外,还可以使用JTree的其他方法来获取所有选中节点的列表或通过编程方式选择节点:
- `getSelectionPaths()`:返回一个`TreePath`对象数组,标识当前所有被选中的路径/节点。
- `setSelectionPaths()`:允许代码指定应选择哪些路径。
- `getSelectionRows()`和`setSelectionInterval()`:如果想使用节点的索引(垂直位置)值而不是`TreeNode`实例来标识路径,可以使用这两个方法。
以下是一个使用`getSelectionPaths()`方法创建的应用程序示例,该应用程序显示一个弹出菜单,用于删除当前选中的节点:
```java
import java.awt.event.*;
import javax.swing.*;
import javax.swing.tree.*;
public class DeleteNodes extends JFrame {
private JTree tree;
public static void main(String[] args) {
DeleteNodes dn = new DeleteNodes(new JTree());
dn.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
dn.setSize(400, 300);
dn.setVisible(true);
}
public DeleteNodes(JTree jt) {
super("Node Selection");
tree = jt;
getContentPane().add(tree);
tree.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent event) {
if (((event.getModifiers() &
InputEvent.BUTTON3_MASK)
!= 0) &&
(tree.getSelectionCount() > 0)) {
showMenu(event.getX(), event.getY());
}
}
});
}
private void showMenu(int x, int y) {
JPopupMenu popup = new JPopupMenu();
JMenuItem mi = new JMenuItem("Delete");
TreePath path = tree.getSelectionPath();
Object node = path.getLastPathComponent();
if (node == tree.getModel().getRoot()) {
mi.setEnabled(false);
}
popup.add(mi);
mi.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
deleteSelectedItems();
}
});
popup.show(tree, x, y);
}
private void deleteSelectedItems() {
DefaultMutableTreeNode node;
DefaultTreeModel model =
(DefaultTreeModel)(tree.getModel());
TreePath[] paths = tree.getSelectionPaths();
for (int i = 0; i < paths.length; i++) {
node = (
```
0
0
复制全文
相关推荐










