JTree 编辑、删除、添加节点
2013-04-14 21:54
330 查看
转自:点击打开链接
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(); } }
相关文章推荐
- JTree右键菜单实现编辑、添加、删除节点
- JTree 编辑、删除、添加节点
- JTree 编辑、删除、添加节点
- jTree 添加、编辑、删除节点
- 微图中如何添加线、编辑线节点和删除线条
- JTree 添加删除节点
- 一个JTree节点添加、删除和修改的例子
- 编辑tree节点。添加,删除。
- JTree 添加删除搜索节点
- mongodb replica set 添加删除节点的2种方法
- 单链表创建,删除节点,添加节点,排序
- JavaScript DOM概述(获取节点的方法/节点的访问关系/节点创建添加删除复制/属性获取设置删除)
- mfc树控件Tree Control 修改添加删除节点
- rhel7.2 + Oracle 11.2.0.4 RAC删除添加节点操作
- jsDOM添加和删除(remove)节点
- AE编辑-显示、增加、删除节点
- hadoop添加节点和删除节点
- UITableView 编辑状态(删除、添加、移动)
- 单链表的java语言完整实现含添加删除节点
- 【原创】使用yahoo雅虎js库(YUI)建立无刷新的N级树(可添加删除节点)