【问题标题】:How to add a mouse listener to a JTree so that I can change the cursor (to a hand cursor) when hovering over a node?如何将鼠标侦听器添加到 JTree,以便在悬停在节点上时可以更改光标(手形光标)?
【发布时间】:2010-03-17 14:30:25
【问题描述】:

正如问题所述,我想为我的JTree 设置一个鼠标侦听器,以便当用户将鼠标放在节点上时我可以将光标更改为HAND_CURSOR

我已经在我的 JTree 上注册了一个 MouseAdapter 来处理点击事件,但我似乎无法获得一个 MouseMovedMouseEntered/MouseExited 来处理我正在尝试做的事情。

有什么建议吗?

【问题讨论】:

    标签: java mouse jtree


    【解决方案1】:

    你需要添加一个MouseMotionListener/Adapter:

    tree.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseMoved(MouseEvent e) {
            int x = (int) e.getPoint().getX();
            int y = (int) e.getPoint().getY();
            TreePath path = tree.getPathForLocation(x, y);
            if (path == null) {
                tree.setCursor(Cursor.getDefaultCursor());
            } else {
                tree.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
            }
        }
    });
    

    【讨论】:

    • 哇,这很好用。我从没想过要使用 MouseMotionAdapter。想解释一下为什么这有效,而不是使用 mouseMoved 的 MouseAdapter?
    • 我确信这也适用于 MouseAdapter——两者仅在它们适应的接口上有所不同:MouseAdapter 实现了几乎所有与鼠标相关的侦听器(MouseListener、MouseWheelListener 和 MouseMotionListener),而 MouseMotionAdapter 仅实现鼠标运动监听器。 mouseMoved() 方法在 MouseMotionListener 中声明,因此对于两个适配器都是相同的。在示例中,我们只对运动感兴趣,因此 MouseMotionListener/Adapter 就足够了,但如果您的应用程序还关心其他鼠标事件,请随意使用 MouseAdapter。希望这会有所帮助...
    【解决方案2】:

    在 JTree 中,每个树节点都由与该树关联的TreeCellRenderer 生成的标签显示。通常使用的类是DefaultTreeCellRenderer,它呈现这个(DefaultTreeCellRenderer)。因此,您可以尝试添加这个 DefaultTreeCellRenderer 一个 MouseMotionListener 来切换鼠标光标。

    注意,将 MouseMotionListener 添加到树中只会在 Tree 组件上切换鼠标渲染,而不是在鼠标位于标签上时。

    【讨论】:

      猜你喜欢
      • 2012-09-22
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 2014-05-31
      相关资源
      最近更新 更多