Double-click a JTree node and get its name

后端 未结 4 507
忘掉有多难
忘掉有多难 2020-12-11 16:39

How do I double-click a JTree node and get its name?

If I call evt.getSource() it seems that the object returned is a JTree. I can\'t cast it to a Defa

相关标签:
4条回答
  • 2020-12-11 16:53

    From the Java Docs

    If you are interested in detecting either double-click events or when a user clicks on a node, regardless of whether or not it was selected, we recommend you do the following:

    final JTree tree = ...;
    
    MouseListener ml = new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            int selRow = tree.getRowForLocation(e.getX(), e.getY());
            TreePath selPath = tree.getPathForLocation(e.getX(), e.getY());
            if(selRow != -1) {
                if(e.getClickCount() == 1) {
                    mySingleClick(selRow, selPath);
                }
                else if(e.getClickCount() == 2) {
                    myDoubleClick(selRow, selPath);
                }
            }
        }
    };
    tree.addMouseListener(ml);
    

    To get the nodes from the TreePath you can walk the path or simply, in your case, use TreePath#getLastPathComponent.

    This returns an Object, so you will need to cast back to the required node type yourself.

    0 讨论(0)
  • 2020-12-11 17:08

    My example. We can detect Double-click with delay.

    public class TreeListener extends MouseAdapter{
        private JTree _Tree;
        private boolean singleClick  = true;
        private int doubleClickDelay = 300;
        private Timer timer;    
    
        public TreeListener(JTree tree)
        {
            this._Tree = tree;
            ActionListener actionListener = new ActionListener() {
    
                public void actionPerformed(ActionEvent e) {                
                    timer.stop();
                    if (singleClick) {
                        singleClickHandler(e);
                    } else {
                        try {
                            doubleClickHandler(e);
                        } catch (ParseException ex) {
                            Logger.getLogger(ex.getMessage());
                        }
                    }
                }
            }; 
            timer = new javax.swing.Timer(doubleClickDelay, actionListener);
            timer.setRepeats(false);
        }
    
        public void mouseClicked(MouseEvent e) { 
            if (e.getClickCount() == 1) {
                singleClick = true;
                timer.start();
            } else {
                singleClick = false;
            }
        }
    
         private void singleClickHandler(ActionEvent e) {
            System.out.println("-- single click --");
        }
    
         private void doubleClickHandler(ActionEvent e) throws ParseException {         
            System.out.println("-- double click -- id=");      
    
        }     
    }
    
    0 讨论(0)
  • 2020-12-11 17:10

    The following code works for me.

    tree.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    DefaultMutableTreeNode node = (DefaultMutableTreeNode)
                           tree.getLastSelectedPathComponent();
                    if (node == null) return;
                    Object nodeInfo = node.getUserObject();
                    // Cast nodeInfo to your object and do whatever you want
                }
            }
        });
    
    0 讨论(0)
  • 2020-12-11 17:10

    MadProgrammer has pretty much everything covered. To get the object you can call

    DefaultMutableTreeNode selectedNode =
       ((DefaultMutableTreeNode)selPath.getLastPathComponent()).
       getUserObject();
    
    0 讨论(0)
提交回复
热议问题