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