获取JFrame的鼠标位置,即使其子组件已聚焦

时间:2013-08-22 06:39:46

标签: java swing jframe

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

2 个答案:

答案 0 :(得分: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鼠标事件的设计工作原理,你无能为力。

答案 1 :(得分: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);
        }
    }

};