`

JTree 编辑、删除、添加节点(转)

 
阅读更多

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();  
    }  

分享到:
评论

相关推荐

    java Swing JTree的教程实例

    `DefaultMutableTreeNode`是可变的树节点,意味着它可以添加或删除子节点。在上述代码中,`createTree()`方法创建了一个新的`JTree`实例,并通过`DefaultMutableTreeNode`构造了一个简单的树结构。首先创建根节点,...

    JTree的Doc文档

    5. **定制行为**:`JTree`提供了很多方法来定制其行为,如`setEditable()`(设置是否允许编辑节点)、`setShowsRootHandles()`(显示或隐藏根节点的手柄)。 6. **遍历和访问节点**:可以使用`TreePath`和`...

    JavaSwing中的JTree模型.pdf

    MutableTreeNode 接口扩展了 TreeNode,增加了节点修改的能力,如添加、删除子节点以及设置用户对象。这使得我们可以动态地更新树的结构。表3中列举了这个接口的一些关键方法,例如 `add()`、`remove()` 和 `...

    MeJT.rar_jtree

    DefaultMutableTreeNode是JTree中常用的模型类,它可以动态地添加、删除和修改节点。然后,他们会将这个树模型(TreeModel)与JTree组件关联起来,通常通过调用`new JTree(model)`来实现。接着,可能还会设置JTree的...

    swing界面设计之JTree

    #### (五) JTree右键菜单实现编辑、添加、删除节点 **Test.java源代码**:示例代码展示了如何在JTree上添加右键菜单,并实现编辑、添加、删除等功能。 #### (六) 功能齐全的JTree例子 **TreeEditTest.java源代码*...

    jtree和QQ项目\带有右键的树(数据库)

    对于展示在`JTree`中的数据,可能需要通过查询语句获取表结构和记录,然后将结果转换为树形结构,添加到`JTree`的模型中。 在实际开发中,为了提高用户体验和数据一致性,还可能涉及到线程处理、事务管理以及异常...

    Login_Java.rar_The Given_jtree

    模型可以动态改变,比如添加、删除或修改节点,JTree会自动更新显示。 3. **事件监听** JTree提供了多种事件监听器,如TreeSelectionListener、TreeModelListener等,可以监听用户的选中、展开、折叠等操作,从而...

    java cs编程 jtree jtable file dom xml GridBagPanel

    开发者可以通过TableModel接口来定制数据源,实现添加、删除、修改表格中的数据。JTable提供了丰富的事件处理机制,如单元格选择、编辑等。 **File操作**: 在Java中,对文件的操作主要通过java.io包中的类完成,如...

    编写一个能动态改变树结点的程序

    它实现了`MutableTreeNode`接口,允许添加、删除和移动子节点,从而支持了树结构的动态更新。 2. **`DefaultTreeModel`**: 是`javax.swing.tree`包中的另一个类,它是`TreeModel`接口的一个默认实现,用于管理树的...

    java树形菜单

    - `DefaultMutableTreeNode` 是 `TreeNode` 的一个实现,提供默认行为和可变性,支持添加、删除和修改子节点。 3. **树模型(TreeModel)**: - `TreeModel` 接口定义了树的数据结构,包括获取节点数量、获取父...

    checknode(树型)

    5. **可编辑性**:在某些情况下,用户可能需要添加、删除或重命名节点。 总的来说,"checknode(树型)"是Java Swing中的一个增强功能,允许用户通过复选框与JTree交互。通过自定义渲染器和节点类,我们可以实现...

    instrument/JTree-开源

    然而,标准的JTree组件虽然功能强大,但在某些高级功能上可能显得不足,例如拖放操作、树结构的动态重组、节点名称的编辑以及撤销/重做功能。为了解决这些问题,开源社区提供了一个名为`instrument/JTree`的扩展库,...

    Java目录树控件

    默认的`JTree`可能不符合所有设计要求,你可以通过创建`TreeCellRenderer`和`TreeCellEditor`来自定义节点的显示和编辑方式。例如,你可以改变节点的图标,根据文件类型显示不同的颜色等。 六、性能优化 如果文件...

    高级swing组件PPT

    - **节点操作**:可以添加、删除、重命名树节点,也可以控制节点是否展开或折叠。 【表格组件JTable的使用】 JTable是Swing中用于显示二维数据的组件,通常用于显示列表或表格形式的数据。它可以动态调整大小,...

    treeview

    - **Python(tkinter)**:Python的标准GUI库tkinter提供了一个`ttk.Treeview`类,使用`insert()`方法添加节点。 - **JavaScript(HTML5)**:HTML5的`<ul>`和`<li>`元素配合CSS和JavaScript可以模拟Treeview效果...

    树状视图演示程序ExTree

    这些控件允许用户通过添加、删除节点,展开或折叠节点来交互。 3. 模型-视图-控制器(MVC)架构:在设计树状视图时,常常采用MVC模式,其中模型负责数据的存储和处理,视图负责显示数据,而控制器则处理用户输入,...

    Java XML Editor源码

    - **添加/删除节点**:编辑器应支持在JTree中添加新的XML元素,以及删除已存在的元素。 - **修改属性**:用户应能修改XML元素的属性值。 - **保存与加载**:编辑器需要有保存修改后XML文档至文件,以及加载XML...

    树型控件

    - 编辑:允许用户编辑节点的文本,甚至添加、删除和移动节点。 6. **最佳实践** - 清晰的层次:确保层次结构清晰,避免过多的嵌套,以免用户迷失。 - 适当的默认展开状态:合理设置默认展开的节点,让用户一眼...

    树状结构View

    3. **可编辑性**:描述中提到“可任意修改”,这意味着用户可能不仅限于浏览,还可以对树状结构进行编辑操作,比如添加、删除、移动节点,或者更改节点的属性。 4. **遍历与选择**:在树状结构视图中,用户可以通过...

Global site tag (gtag.js) - Google Analytics