В этом статье я покажу вам как в java прикрепить контекстное меню к jtree.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
import javax.swing.*; import javax.swing.tree.*; import java.awt.event.*; import java.awt.*; import java.util.*; public class TreeWithPopup extends JPanel { DefaultMutableTreeNode root, node1, node2, node3; public TreeWithPopup() { MyJTree tree; root = new DefaultMutableTreeNode("root", true); node1 = new DefaultMutableTreeNode("node 1", true); node2 = new DefaultMutableTreeNode("node 2" , true); node3 = new DefaultMutableTreeNode("node 3", true); root.add(node1); node1.add(node2); root.add(node3); setLayout(new BorderLayout()); tree = new MyJTree(root); add(new JScrollPane((JTree)tree),"Center"); } public Dimension getPreferredSize(){ return new Dimension(300, 300); } public static void main(String s[]){ JFrame frame = new JFrame("Tree With Popup"); TreeWithPopup panel = new TreeWithPopup(); frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); frame.setForeground(Color.black); frame.setBackground(Color.lightGray); frame.getContentPane().add(panel,"Center"); frame.setSize(panel.getPreferredSize()); frame.setVisible(true); frame.addWindowListener(new WindowCloser()); } } class WindowCloser extends WindowAdapter { public void windowClosing(WindowEvent e) { Window win = e.getWindow(); win.setVisible(false); System.exit(0); } } class MyJTree extends JTree implements ActionListener{ JPopupMenu popup; JMenuItem mi; MyJTree(DefaultMutableTreeNode dmtn) { super(dmtn); // define the popup popup = new JPopupMenu(); mi = new JMenuItem("Insert a children"); mi.addActionListener(this); mi.setActionCommand("insert"); popup.add(mi); mi = new JMenuItem("Remove this node"); mi.addActionListener(this); mi.setActionCommand("remove"); popup.add(mi); popup.setOpaque(true); popup.setLightWeightPopupEnabled(true); addMouseListener( new MouseAdapter() { public void mouseReleased( MouseEvent e ) { if ( e.isPopupTrigger()) { popup.show( (JComponent)e.getSource(), e.getX(), e.getY() ); } } } ); } public void actionPerformed(ActionEvent ae) { DefaultMutableTreeNode dmtn, node; TreePath path = this.getSelectionPath(); dmtn = (DefaultMutableTreeNode) path.getLastPathComponent(); if (ae.getActionCommand().equals("insert")) { node = new DefaultMutableTreeNode("children"); dmtn.add(node); // thanks to Yong Zhang for the tip for refreshing the tree structure. ((DefaultTreeModel )this.getModel()).nodeStructureChanged((TreeNode)dmtn); } if (ae.getActionCommand().equals("remove")) { node = (DefaultMutableTreeNode)dmtn.getParent(); // Bug fix by essam int nodeIndex=node.getIndex(dmtn); // объявим целочисленный, чтобы удерживать выбранный индекс узлов dmtn.removeAllChildren(); // удалить всех детей выбранного узла node.remove(nodeIndex); // удалить выбранный узел, сохранить своих братьев и сестер ((DefaultTreeModel )this.getModel()).nodeStructureChanged((TreeNode)dmtn); } } } |