【问题标题】:Double-click a JTree node and get its name双击 JTree 节点并获取其名称
【发布时间】:2012-10-11 20:23:04
【问题描述】:

如何双击 JTree 节点并获取其名称?

如果我调用evt.getSource(),返回的对象似乎是一个 JTree。我无法将其转换为 DefaultMutableTreeNode。

【问题讨论】:

    标签: java actionlistener jtree


    【解决方案1】:

    来自Java Docs

    如果您对检测双击事件或何时检测感兴趣 用户点击一个节点,不管它是否被选中, 我们建议您执行以下操作:

    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);
    

    要从 TreePath 获取节点,您可以走路径,或者在您的情况下简单地使用 TreePath#getLastPathComponent

    这将返回一个Object,因此您需要自己转换回所需的节点类型。

    【讨论】:

    • 是的。我知道这一点。但是如何使用 selRow 和 selPath??
    • 接下来你需要做的是阅读TreePath的API条目
    【解决方案2】:

    以下代码适用于我。

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

    【讨论】:

      【解决方案3】:

      MadProgrammer 几乎涵盖了所有内容。要获取您可以调用的对象

      DefaultMutableTreeNode selectedNode =
         ((DefaultMutableTreeNode)selPath.getLastPathComponent()).
         getUserObject();
      

      【讨论】:

      • 也许我们应该将其用作 Object 然后进行转换:Object selectedNode = ( (DefaultMutableTreeNode) selPath.getLastPathComponent()).getUserObject();
      【解决方案4】:

      我的例子。我们可以检测到有延迟的双击。

      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=");      
      
          }     
      }
      

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 2011-12-10
        • 2011-07-04
        • 2020-08-30
        • 2010-11-16
        • 1970-01-01
        • 2011-09-03
        • 2019-12-03
        相关资源
        最近更新 更多