JTree的用法實踐


package json;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.tree.*;

public class JTreeTest implements ActionListener, TreeModelListener {
    JLabel label = null;
    JTree tree = null;
    DefaultTreeModel treeModel = null;
    String nodeName = null;// 原有節點名稱

    public JTreeTest() {
        JFrame f = new JFrame("");
        Container contentPane = f.getContentPane();

        DefaultMutableTreeNode root = new DefaultMutableTreeNode("JSON結構");

        tree = new JTree(root);
        tree.setEditable(true);
        tree.addMouseListener(new MouseHandle());
        treeModel = (DefaultTreeModel) tree.getModel();
        treeModel.addTreeModelListener(this);
        // add this listener for edit the tree node
        tree.getCellEditor().addCellEditorListener(new Tree_CellEditorAction());
        JScrollPane scrollPane = new JScrollPane();
        scrollPane.setViewportView(tree);

        JPanel panel = new JPanel();
        JButton b = new JButton("新增節點");
        b.addActionListener(this);
        panel.add(b);
        b = new JButton("刪除節點");
        b.addActionListener(this);
        panel.add(b);
        b = new JButton("清除所有節點");
        b.addActionListener(this);
        panel.add(b);

        label = new JLabel("Action");
        contentPane.add(panel, BorderLayout.NORTH);
        contentPane.add(scrollPane, BorderLayout.CENTER);
        contentPane.add(label, BorderLayout.SOUTH);
        f.pack();
        f.setVisible(true);
        f.requestFocus();
        f.setSize(400, 300);
        f.setLocationRelativeTo(null);
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }

            public void windowLostFocus(WindowEvent e) {
                System.out.println("ggg");
            }
        });
    }

    // 本方法運行新增、刪除、清除所有節點的程序代碼.
    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()));
            label.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);
                    label.setText("刪除節點成功");
                }
            }
        }
        if (ae.getActionCommand().equals("清除所有節點")) {

            // 下面一行,由DefaultTreeModel的getRoot()方法取得根節點.
            DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) treeModel.getRoot();

            // 下面一行刪除所有子節點.
            rootNode.removeAllChildren();

            // 刪除完后務必運行DefaultTreeModel的reload()操作,整個Tree的節點才會真正被刪除.
            treeModel.reload();
            label.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) {
        }
        label.setText(nodeName + "更改數據為:" + (String) node.getUserObject());
    }

    public void treeNodesInserted(TreeModelEvent e) {
        System.out.println("new node insered");
    }

    public void treeNodesRemoved(TreeModelEvent e) {
        System.out.println("node deleted");
    }

    public void treeStructureChanged(TreeModelEvent e) {
        System.out.println("Structrue changed");
    }

    public static void main(String[] args) {
        new JTreeTest();
    }

    class MouseHandle 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();
                nodeName = treenode.toString();
            } catch (NullPointerException ne) {
            }
        }
    }

    class Tree_CellEditorAction 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);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM