zoukankan      html  css  js  c++  java
  • JTree 添加 , 删除, 修改

    package com.swing.demo;
    
    import java.awt.BorderLayout;
    import java.awt.Container;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    
    import javax.swing.CellEditor;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTree;
    import javax.swing.event.CellEditorListener;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.TreeModelEvent;
    import javax.swing.event.TreeModelListener;
    import javax.swing.tree.DefaultMutableTreeNode;
    import javax.swing.tree.DefaultTreeModel;
    import javax.swing.tree.TreeNode;
    import javax.swing.tree.TreePath;
    
    /**
     * tree node 添加 , 删除, 修改
     * 
     * @author Administrator
     *
     */
    public class JTreeTest implements ActionListener, TreeModelListener {
        private JLabel statusLabel = null;
        private JTree tree = null;
        private DefaultTreeModel treeModel = null;
        private String oldNodeName = null;
    
        public JTreeTest() {
            JFrame frame = new JFrame("JTreeTest 窗体");
            Container contentPane = frame.getContentPane();
    
            DefaultMutableTreeNode root = new DefaultMutableTreeNode("根节点");
            tree = new JTree(root);
            tree.addMouseListener(new MyTreeMouseListener());
            treeModel = (DefaultTreeModel) tree.getModel();
            treeModel.addTreeModelListener(this);
            tree.setEditable(true);
            tree.getCellEditor().addCellEditorListener(
                    new MyTreeCellEditorListener());
            JScrollPane scrollPane = new JScrollPane();
            scrollPane.setViewportView(tree);
    
            JPanel toolBarPanel = new JPanel();
            JButton b = new JButton("新增节点");
            b.addActionListener(this);
            toolBarPanel.add(b);
            b = new JButton("删除节点");
            b.addActionListener(this);
            toolBarPanel.add(b);
            b = new JButton("清除所有节点");
            b.addActionListener(this);
            toolBarPanel.add(b);
    
            statusLabel = new JLabel("Action");
            contentPane.add(toolBarPanel, BorderLayout.NORTH);
            contentPane.add(scrollPane, BorderLayout.CENTER);
            contentPane.add(statusLabel, BorderLayout.SOUTH);
            frame.pack();
            frame.setVisible(true);
            frame.requestFocus();
            frame.setSize(400, 300);
            frame.setLocationRelativeTo(null);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        // 本方法运行新增、删除、清除所有节点的程序代码.
        public void actionPerformed(ActionEvent ae) {
            if (ae.getActionCommand().equals("新增节点")) {
                DefaultMutableTreeNode parentNode = null;
                DefaultMutableTreeNode newNode = new DefaultMutableTreeNode("新节点");
                newNode.setAllowsChildren(true);
                TreePath parentPath = tree.getSelectionPath();
                if (parentPath == null) {
                    return;
                }
                // 取得新节点的父节点
                parentNode = (DefaultMutableTreeNode) (parentPath
                        .getLastPathComponent());
    
                // 由DefaultTreeModel的insertNodeInto()方法增加新节点
                treeModel.insertNodeInto(newNode, parentNode,
                        parentNode.getChildCount());
    
                // tree的scrollPathToVisible()方法在使Tree会自动展开文件夹以便显示所加入的新节点。若没加这行则加入的新节点
                // 会被 包在文件夹中,你必须自行展开文件夹才看得到。
                tree.scrollPathToVisible(new TreePath(newNode.getPath()));
                tree.setSelectionPath(new TreePath(newNode.getPath()));
                statusLabel.setText("新增节点成功");
            }
            if (ae.getActionCommand().equals("删除节点")) {
                TreePath treepath = tree.getSelectionPath();
                if (treepath != null) {
                    // 下面两行取得选取节点的父节点.
                    DefaultMutableTreeNode selectionNode = (DefaultMutableTreeNode) treepath
                            .getLastPathComponent();
                    TreeNode parent = (TreeNode) selectionNode.getParent();
                    if (parent != null) {
                        // 由DefaultTreeModel的removeNodeFromParent()方法删除节点,包含它的子节点。
                        treeModel.removeNodeFromParent(selectionNode);
                        statusLabel.setText("删除节点成功");
                    }
                }
            }
            if (ae.getActionCommand().equals("清除所有节点")) {
    
                // 下面一行,由DefaultTreeModel的getRoot()方法取得根节点.
                DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) treeModel
                        .getRoot();
    
                // 下面一行删除所有子节点.
                rootNode.removeAllChildren();
    
                // 删除完后务必运行DefaultTreeModel的reload()操作,整个Tree的节点才会真正被删除.
                treeModel.reload();
                statusLabel.setText("清除所有节点成功");
            }
        }
    
        public void treeNodesChanged(TreeModelEvent e) {
            TreePath treePath = e.getTreePath();
            DefaultMutableTreeNode node = (DefaultMutableTreeNode) treePath
                    .getLastPathComponent();
            try {
                int[] index = e.getChildIndices();
                node = (DefaultMutableTreeNode) node.getChildAt(index[0]);
            } catch (NullPointerException exc) {
            }
            statusLabel.setText(oldNodeName + "更改数据为:"
                    + (String) node.getUserObject());
        }
    
        public static void main(String[] args) {
            new JTreeTest();
        }
    
        class MyTreeMouseListener extends MouseAdapter {
            public void mousePressed(MouseEvent e) {
                try {
                    JTree tree = (JTree) e.getSource();
                    int rowLocation = tree.getRowForLocation(e.getX(), e.getY());
                    TreePath treepath = tree.getPathForRow(rowLocation);
                    TreeNode treenode = (TreeNode) treepath.getLastPathComponent();
                    oldNodeName = treenode.toString();
                } catch (NullPointerException ne) {
                }
            }
        }
    
        class MyTreeCellEditorListener implements CellEditorListener {
            public void editingStopped(ChangeEvent e) {
                Object selectnode = tree.getLastSelectedPathComponent();
                DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectnode;
                CellEditor cellEditor = (CellEditor) e.getSource();
                String newName = (String) cellEditor.getCellEditorValue();
                node.setUserObject(newName);
    
                DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
                model.nodeStructureChanged(node);
            }
    
            public void editingCanceled(ChangeEvent e) {
                editingStopped(e);
            }
        }
    
        @Override
        public void treeNodesInserted(TreeModelEvent e) {
        }
    
        @Override
        public void treeNodesRemoved(TreeModelEvent e) {
        }
    
        @Override
        public void treeStructureChanged(TreeModelEvent e) {
        }
    }
  • 相关阅读:
    netty 解决TCP粘包与拆包问题(二)
    Socket通讯-Netty框架实现Java通讯
    SpringBoot集成Swagger,Postman,newman,jenkins自动化测试.
    Java Console/控制台 打印表格
    mysql控制台的一些技巧,显示,输入换行,语法正则等
    “妈妈,我不想学了”,你的回答改变孩子一生(怅然若失,说了一句话:“为什么当初没有人逼我?”。我不愿意学,你就不让我学啦!那时候我还小,我还不懂事,难道你也不懂事吗。要做成一件事,就必须有延迟满足的能力)
    “太子”显然沉稳不足,急于把大权抓在自己手里,做的第一件事居然是想尽一切办法铲除父亲在公司的亲信(我很久以来的疑惑,看了这段才明白,相比之下,经过玄武门之变的李世民仍然忍了裴寂三年时间是何等的聪明和了不起)
    如何分析和提高大型项目(C/C++)的编译速度?(VS2015特有的:/LTCG:incremental选项)
    Duilib学习之基础(一个SDK程序)
    使用 QWorker 做为计划任务引擎
  • 原文地址:https://www.cnblogs.com/freshier/p/4614811.html
Copyright © 2011-2022 走看看