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) { } }