先上代码,大家可以直接运行一下。
问题在下面。package org.wuyigong.Swing.JTree;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;import javax.swing.JFrame;
import javax.swing.JMenuItem;
import javax.swing.JPopupMenu;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellEditor;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;public class Test extends JFrame implements MouseListener, ActionListener { JTree tree; JPopupMenu popMenu; // 菜单 JMenuItem addItem; // 各个菜单项 JMenuItem delItem; JMenuItem editItem; public Test() { tree = new JTree(); tree.setEditable(true); tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION); tree.addMouseListener(this); tree.setCellEditor(new DefaultTreeCellEditor(tree, new DefaultTreeCellRenderer())); getContentPane().add(tree); setSize(200, 200); // 添加菜单项以及为菜单项添加事件 popMenu = new JPopupMenu(); addItem = new JMenuItem("添加"); addItem.addActionListener(this); delItem = new JMenuItem("删除"); addItem.addActionListener(this);
editItem = new JMenuItem("修改"); addItem.addActionListener(this);
popMenu.add(addItem); popMenu.add(delItem); popMenu.add(editItem); getContentPane().add(new JScrollPane(tree)); } public void mouseClicked(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mousePressed(MouseEvent e) { TreePath path = tree.getPathForLocation(e.getX(), e.getY()); // 关键是这个方法的使用 if (path == null) { // JTree上没有任何项被选中 return; } tree.setSelectionPath(path); if (e.getButton() == 3) { popMenu.show(tree, e.getX(), e.getY()); } } public void mouseReleased(MouseEvent e) { } // 弹出菜单的事件处理程序(需要实现ActionListener接口) public void actionPerformed(ActionEvent e) { DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree .getLastSelectedPathComponent(); // 获得右键选中的节点 if (e.getSource() == addItem) {                        //添加节点
((DefaultTreeModel) tree.getModel()).insertNodeInto( new DefaultMutableTreeNode("Test"), node, 0); tree.expandPath(tree.getSelectionPath()); } else if (e.getSource() == delItem) { if (node.isRoot()) { return; } ((DefaultTreeModel) tree.getModel()).removeNodeFromParent(node); } else if (e.getSource() == editItem) { tree.startEditingAtPath(tree.getSelectionPath()); } } public static void main(String[] args) { Test frame = new Test(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}这段代码是用来演示给节点JTree节点添加右键监听事件的,右键点选节点之后可以添加、删除、修改节点。
不过我疑惑的是为什么点击“添加”的时候,会同时添加了3个一样的节点?
还有就是为什么点选“删除”的时候,貌似代码中有删除节点的方法,可是实际上节点并没有被删除?望大牛速速来解救我这颗小白菜。