import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;
public class EditJTree
{
JFrame jf;
JTree tree;
//上面JTree对象对应的model
DefaultTreeModel model;
//定义几个初始节点
DefaultMutableTreeNode root = new DefaultMutableTreeNode("中国");
DefaultMutableTreeNode guangdong = new DefaultMutableTreeNode("广东");
DefaultMutableTreeNode guangxi = new DefaultMutableTreeNode("广西");
DefaultMutableTreeNode foshan = new DefaultMutableTreeNode("佛山");
DefaultMutableTreeNode shantou = new DefaultMutableTreeNode("汕头");
DefaultMutableTreeNode guilin = new DefaultMutableTreeNode("桂林");
DefaultMutableTreeNode nanning = new DefaultMutableTreeNode("南宁");
//定义需要被拖动的TreePath
TreePath movePath;
JButton addSiblingButton = new JButton("添加兄弟节点");
JButton addChildButton = new JButton("添加子节点");
JButton deleteButton = new JButton("删除节点");
JButton editButton = new JButton("编辑当前节点");
public void init()
{
guangdong.add(foshan);
guangdong.add(shantou);
guangxi.add(guilin);
guangxi.add(nanning);
root.add(guangdong);
root.add(guangxi);
jf = new JFrame("树");
tree = new JTree(root);
//获取JTree对应的TreeModel对象
model = (DefaultTreeModel)tree.getModel();
//设置JTree可编辑
tree.setEditable(true);
MouseListener ml = new MouseAdapter()
{
//按下鼠标时候获得被拖动的节点
public void mousePressed(MouseEvent e)
{
//如果需要唯一确定某个节点,必须通过TreePath来获取。
TreePath tp = tree.getPathForLocation(e.getX(), e.getY());
if (tp != null)
{
movePath = tp;
}
}
//鼠标松开时获得需要拖到哪个父节点
public void mouseReleased(MouseEvent e)
{
//根据鼠标松开时的TreePath来获取TreePath
TreePath tp = tree.getPathForLocation(e.getX(), e.getY());
if (tp != null && movePath != null)
{
//阻止向子节点拖动
if (movePath.isDescendant(tp) && movePath != tp)
{
JOptionPane.showMessageDialog(jf, "目标节点是被移动节点的子节点,无法移动!",
"非法操作", JOptionPane.ERROR_MESSAGE );
return;
}
//既不是向子节点移动,而且鼠标按下、松开的不是同一个节点
else if (movePath != tp)
{
System.out.println(tp.getLastPathComponent());
//add方法可以先将原节点从原父节点删除,再添加到新父节点中
((DefaultMutableTreeNode)tp.getLastPathComponent()).add(
(DefaultMutableTreeNode)movePath.getLastPathComponent());
movePath = null;
tree.updateUI();
}
}
}
};
tree.addMouseListener(ml);
JPanel panel = new JPanel();
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;
//创建一个新节点
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点");
//获取选中节点的选中索引
int selectedIndex = parent.getIndex(selectedNode);
//在选中位置插入新节点
model.insertNodeInto(newNode, parent, selectedIndex + 1);
//--------下面代码实现显示新节点(自动展开父节点)-------
//获取从根节点到新节点的所有节点
TreeNode[] nodes = model.getPathToRoot(newNode);
//使用指定的节点数组来创建TreePath
TreePath path = new TreePath(nodes);
//显示指定TreePath
tree.scrollPathToVisible(path);
}
});
panel.add(addSiblingButton);
addChildButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
//获取选中节点
DefaultMutableTreeNode selectedNode
= (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
//如果节点为空,直接返回
if (selectedNode == null) return;
//创建一个新节点
DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点");
//直接通过model来添加新节点,则无需通过调用JTree的updateUI方法
//model.insertNodeInto(newNode, selectedNode, selectedNode.getChildCount());
//直接通过节点添加新节点,则需要调用tree的updateUI方法
selectedNode.add(newNode);
//--------下面代码实现显示新节点(自动展开父节点)-------
TreeNode[] nodes = model.getPathToRoot(newNode);
TreePath path = new TreePath(nodes);
tree.scrollPathToVisible(path);
tree.updateUI();
}
});
panel.add(addChildButton);
deleteButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
DefaultMutableTreeNode selectedNode
= (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
if (selectedNode != null && selectedNode.getParent() != null)
{
//删除指定节点
model.removeNodeFromParent(selectedNode);
}
}
});
panel.add(deleteButton);
editButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
TreePath selectedPath = tree.getSelectionPath();
if (selectedPath != null)
{
//编辑选中节点
tree.startEditingAtPath(selectedPath);
}
}
});
panel.add(editButton);
jf.add(new JScrollPane(tree));
jf.add(panel , BorderLayout.SOUTH);
jf.pack();
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setVisible(true);
}
public static void main(String[] args)
{
new EditJTree().init();
}
}
相关推荐
`DefaultMutableTreeNode`是可变的树节点,意味着它可以添加或删除子节点。在上述代码中,`createTree()`方法创建了一个新的`JTree`实例,并通过`DefaultMutableTreeNode`构造了一个简单的树结构。首先创建根节点,...
5. **定制行为**:`JTree`提供了很多方法来定制其行为,如`setEditable()`(设置是否允许编辑节点)、`setShowsRootHandles()`(显示或隐藏根节点的手柄)。 6. **遍历和访问节点**:可以使用`TreePath`和`...
MutableTreeNode 接口扩展了 TreeNode,增加了节点修改的能力,如添加、删除子节点以及设置用户对象。这使得我们可以动态地更新树的结构。表3中列举了这个接口的一些关键方法,例如 `add()`、`remove()` 和 `...
DefaultMutableTreeNode是JTree中常用的模型类,它可以动态地添加、删除和修改节点。然后,他们会将这个树模型(TreeModel)与JTree组件关联起来,通常通过调用`new JTree(model)`来实现。接着,可能还会设置JTree的...
#### (五) JTree右键菜单实现编辑、添加、删除节点 **Test.java源代码**:示例代码展示了如何在JTree上添加右键菜单,并实现编辑、添加、删除等功能。 #### (六) 功能齐全的JTree例子 **TreeEditTest.java源代码*...
对于展示在`JTree`中的数据,可能需要通过查询语句获取表结构和记录,然后将结果转换为树形结构,添加到`JTree`的模型中。 在实际开发中,为了提高用户体验和数据一致性,还可能涉及到线程处理、事务管理以及异常...
模型可以动态改变,比如添加、删除或修改节点,JTree会自动更新显示。 3. **事件监听** JTree提供了多种事件监听器,如TreeSelectionListener、TreeModelListener等,可以监听用户的选中、展开、折叠等操作,从而...
开发者可以通过TableModel接口来定制数据源,实现添加、删除、修改表格中的数据。JTable提供了丰富的事件处理机制,如单元格选择、编辑等。 **File操作**: 在Java中,对文件的操作主要通过java.io包中的类完成,如...
它实现了`MutableTreeNode`接口,允许添加、删除和移动子节点,从而支持了树结构的动态更新。 2. **`DefaultTreeModel`**: 是`javax.swing.tree`包中的另一个类,它是`TreeModel`接口的一个默认实现,用于管理树的...
- `DefaultMutableTreeNode` 是 `TreeNode` 的一个实现,提供默认行为和可变性,支持添加、删除和修改子节点。 3. **树模型(TreeModel)**: - `TreeModel` 接口定义了树的数据结构,包括获取节点数量、获取父...
5. **可编辑性**:在某些情况下,用户可能需要添加、删除或重命名节点。 总的来说,"checknode(树型)"是Java Swing中的一个增强功能,允许用户通过复选框与JTree交互。通过自定义渲染器和节点类,我们可以实现...
然而,标准的JTree组件虽然功能强大,但在某些高级功能上可能显得不足,例如拖放操作、树结构的动态重组、节点名称的编辑以及撤销/重做功能。为了解决这些问题,开源社区提供了一个名为`instrument/JTree`的扩展库,...
默认的`JTree`可能不符合所有设计要求,你可以通过创建`TreeCellRenderer`和`TreeCellEditor`来自定义节点的显示和编辑方式。例如,你可以改变节点的图标,根据文件类型显示不同的颜色等。 六、性能优化 如果文件...
- **节点操作**:可以添加、删除、重命名树节点,也可以控制节点是否展开或折叠。 【表格组件JTable的使用】 JTable是Swing中用于显示二维数据的组件,通常用于显示列表或表格形式的数据。它可以动态调整大小,...
- **Python(tkinter)**:Python的标准GUI库tkinter提供了一个`ttk.Treeview`类,使用`insert()`方法添加节点。 - **JavaScript(HTML5)**:HTML5的`<ul>`和`<li>`元素配合CSS和JavaScript可以模拟Treeview效果...
这些控件允许用户通过添加、删除节点,展开或折叠节点来交互。 3. 模型-视图-控制器(MVC)架构:在设计树状视图时,常常采用MVC模式,其中模型负责数据的存储和处理,视图负责显示数据,而控制器则处理用户输入,...
- **添加/删除节点**:编辑器应支持在JTree中添加新的XML元素,以及删除已存在的元素。 - **修改属性**:用户应能修改XML元素的属性值。 - **保存与加载**:编辑器需要有保存修改后XML文档至文件,以及加载XML...
- 编辑:允许用户编辑节点的文本,甚至添加、删除和移动节点。 6. **最佳实践** - 清晰的层次:确保层次结构清晰,避免过多的嵌套,以免用户迷失。 - 适当的默认展开状态:合理设置默认展开的节点,让用户一眼...
3. **可编辑性**:描述中提到“可任意修改”,这意味着用户可能不仅限于浏览,还可以对树状结构进行编辑操作,比如添加、删除、移动节点,或者更改节点的属性。 4. **遍历与选择**:在树状结构视图中,用户可以通过...