我想获得我的 JFrame 的鼠标位置。但是当鼠标位于其子组件(例如添加到 JFrame 的表格、按钮)上时,MouseMotion 事件不再监听。如何获取鼠标位置?
问问题
616 次
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 回答