0

我想获得我的 JFrame 的鼠标位置。但是当鼠标位于其子组件(例如添加到 JFrame 的表格、按钮)上时,MouseMotion 事件不再监听。如何获取鼠标位置?

4

2 回答 2

3

我试图在我的 Swing 应用程序上创建一个侧边栏,其中侧边栏是一个未装饰的 JFrame。我已设置在鼠标退出时处理它。但是当我将鼠标移到添加到侧边栏的组件上时,它就会消失。想法可能很愚蠢我是Java新手。

您可以按照 kleopatra 的建议实现 mouseExited ,但与此类似:

MouseListener closer = new MouseAdapter() {
    public void mouseExited(MouseEvent e) {
        // obtain source frame and see if mouse has left it
        Container cnt;
        if (e.getSource() instanceof JFrame) {
            // our frame, no conversion needed
            cnt = (Container) e.getSource();
        } else {
            // inside a descendant
            cnt = SwingUtilities.getAncestorOfClass(
                    JFrame.class, e.getComponent());
            // convert mouse event to make it appear
            // as if the frame generated it (I think :D)
            e = SwingUtilities.convertMouseEvent(
                    e.getComponent(), e, (Component) cnt);
        }            
        Rectangle r = new Rectangle(cnt.getSize());
        if (!r.contains(e.getPoint())) {
            cnt.setVisible(false);
            // or whatever
        }
    }
};

这是为侧边栏及其本身的所有后代组件设置的。无论鼠标悬停在哪个子/后代上,它都应该检查您的鼠标是否仍在侧边栏中。

您还应该考虑使用未修饰的 JDialog 而不是 JFrame。

您的侧边栏消失的原因可能是您只向它添加了一个鼠标侦听器,而不是它的任何子项。这可能违反直觉,但是当您的鼠标指针进入侧边栏的子/后代时,会为侧边栏生成 mouseExited 事件,然后为鼠标进入的任何子/后代生成 mouseEntered 事件。这就是 Swing 鼠标事件的设计方式,您对此无能为力。

于 2013-08-22T12:44:14.253 回答
2

假设您评论中的用例是真正要解决的问题,答案是实现 mouseExited 以便它检查鼠标是否仍在框架上方的某个位置,只有在没有时才隐藏它。

就像是:

MouseListener closer = new MouseAdapter() {

    @Override
    public void mouseExited(MouseEvent e) {
        Rectangle r = new Rectangle(sideBar.getSize());
        if (!r.contains(e.getPoint())) {
            sideBar.setVisible(false);
        }
    }

};
于 2013-08-22T08:46:46.977 回答