我想给数中的几点添加鼠标右击,出现一个下拉菜单,包含删除,新建操作,该怎么操作呢

解决方案 »

  1.   

    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.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("删除"); 
    delItem.addActionListener(this); 
    editItem = new JMenuItem("修改"); 
    editItem.addActionListener(this); popMenu.add(addItem); 
    popMenu.add(delItem); 
    popMenu.add(editItem); 
    } 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) { 
    return; 

    tree.setSelectionPath(path); if (e.getButton() == 3) { 
    popMenu.show(tree, e.getX(), e.getY()); 

    } public void mouseReleased(MouseEvent e) { } public void actionPerformed(ActionEvent e) { 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree 
    .getLastSelectedPathComponent(); 
    if (e.getSource() == addItem) { 
    ((DefaultTreeModel) tree.getModel()).insertNodeInto( 
    new DefaultMutableTreeNode("Test"), node, node 
    .getChildCount()); 
    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); 

    } 简单看一下吧,如果需要封装或者什么的自己看情况
      

  2.   

    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.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("删除"); 
    delItem.addActionListener(this); 
    editItem = new JMenuItem("修改"); 
    editItem.addActionListener(this); popMenu.add(addItem); 
    popMenu.add(delItem); 
    popMenu.add(editItem); 
    } 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) { 
    return; 

    tree.setSelectionPath(path); if (e.getButton() == 3) { 
    popMenu.show(tree, e.getX(), e.getY()); 

    } public void mouseReleased(MouseEvent e) { } public void actionPerformed(ActionEvent e) { 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) tree 
    .getLastSelectedPathComponent(); 
    if (e.getSource() == addItem) { 
    ((DefaultTreeModel) tree.getModel()).insertNodeInto( 
    new DefaultMutableTreeNode("Test"), node, node 
    .getChildCount()); 
    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); 

    } 可以满足需求,但是修改不太好用
      

  3.   

    或者不通过设置Tree.setEditable(true)来实现。通过Tree的CellEditor实现编辑: testTree.setEditable(false); testTree.setCellEditor(new DefaultTreeCellEditor(testTree,
    (NetTestIconNodeRenderer) testTree.getCellRenderer()) {
    /* CellEditor */
    protected TreeCellEditor createTreeCellEditor() {
    /* 边界 */
    Border aBorder = UIManager.getBorder("Tree.editorBorder");
    /* TextField */
    final DefaultTextField test = new DefaultTextField(aBorder);
    /* 添加动作事件 */
    test.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) { }
    }); test.addFocusListener(new FocusAdapter() {
    public void focusLost(FocusEvent e) {
    testTree.setEditable(false);
    }
    }); DefaultCellEditor editor = new DefaultCellEditor(test) { public boolean shouldSelectCell(java.util.EventObject event) {
    boolean retValue = super.shouldSelectCell(event);
    getComponent().requestFocus();
    return retValue;
    } public void cancelEditing() {
    test.setText(nodeName);
    testTree.setEditable(false);
    } public Object getCellEditorValue() {
    if (test.getText().trim().length() > 0) {
    return test.getText().trim();
    } else {
    return nodeName;
    }
    }
    }; return editor;
    }
    });