Java MouseListener 进入和退出不会更新,除非我按 alt tab
Java MouseListener entered and exited don't update unless I alt tab
我有这两个功能
public void mouseEntered(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
if(mouseOver(mx, my, Game.WIDTH / 2 - 285, Game.HEIGHT / 2 - 170, Game.hud.materials[1].getWidth(), Game.hud.materials[1].getHeight()))
isOnMaterial[0] = true;
}
public void mouseExited(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
if(!mouseOver(mx, my, Game.WIDTH / 2 - 285, Game.HEIGHT / 2 - 170, Game.hud.materials[1].getWidth(), Game.hud.materials[1].getHeight()))
isOnMaterial[0] = false;
}
mouseOver
是一个函数,我用它来设置鼠标需要进入的边界以触发某些东西。
所以当我确实进入那个区域时,变量设置为true,如果为true,则用Graphics绘制一个矩形。该矩形不会绘制,除非我按 alt 选项卡 window,它设置为全屏,如下所示:
jf.setExtendedState(JFrame.MAXIMIZED_BOTH);
jf.setUndecorated(true);
这也适用于 mouseExited
函数。因此,当我按下 alt tab 时,我看到绘制了矩形,并且当鼠标存在于该区域时,矩形仍然被绘制,除非我再次 alt tab。
我也知道问题出在这两个函数上,因为我在触发事件时尝试 System.Out.Println()
一些东西,它只在我 alt 选项卡后在控制台上打印一次,我还有一个 System.Out.Println()
在我绘制矩形的函数上,它在我 alt 选项卡后一直打印,不仅一次。 (由于游戏循环)
我希望我的问题很清楚,有什么想法吗?
mouseEntered
和 mouseExited
仅在鼠标作为一个整体进入或离开组件时被调用。您不能使用它来检查鼠标是否进入了组件的特定部分。为此,您应该在 MouseMotionListener
.
中使用 mouseMoved
而不是 MouseListener
class ... implements MouseMotionListener {
//...
public void mouseMoved(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
int hudX = Game.WIDTH / 2 - 285;
int hudY = Game.HEIGHT / 2 - 170;
int hudW = Game.hud.materials[1].getWidth();
int hudH = Game.hud.materials[1].getHeight();
isOnMaterial[0] = mouseOver(mx, my, hudX, hudY, hudW, hudH);
}
}
请注意,这并不会真正通知光标是进入还是离开该区域,它只是检查光标当前是否在其中。
P.S。在代码中使用具有有意义名称的常量。像上面的 285 和 170 这样的幻数是不好的做法。
我有这两个功能
public void mouseEntered(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
if(mouseOver(mx, my, Game.WIDTH / 2 - 285, Game.HEIGHT / 2 - 170, Game.hud.materials[1].getWidth(), Game.hud.materials[1].getHeight()))
isOnMaterial[0] = true;
}
public void mouseExited(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
if(!mouseOver(mx, my, Game.WIDTH / 2 - 285, Game.HEIGHT / 2 - 170, Game.hud.materials[1].getWidth(), Game.hud.materials[1].getHeight()))
isOnMaterial[0] = false;
}
mouseOver
是一个函数,我用它来设置鼠标需要进入的边界以触发某些东西。
所以当我确实进入那个区域时,变量设置为true,如果为true,则用Graphics绘制一个矩形。该矩形不会绘制,除非我按 alt 选项卡 window,它设置为全屏,如下所示:
jf.setExtendedState(JFrame.MAXIMIZED_BOTH);
jf.setUndecorated(true);
这也适用于 mouseExited
函数。因此,当我按下 alt tab 时,我看到绘制了矩形,并且当鼠标存在于该区域时,矩形仍然被绘制,除非我再次 alt tab。
我也知道问题出在这两个函数上,因为我在触发事件时尝试 System.Out.Println()
一些东西,它只在我 alt 选项卡后在控制台上打印一次,我还有一个 System.Out.Println()
在我绘制矩形的函数上,它在我 alt 选项卡后一直打印,不仅一次。 (由于游戏循环)
我希望我的问题很清楚,有什么想法吗?
mouseEntered
和 mouseExited
仅在鼠标作为一个整体进入或离开组件时被调用。您不能使用它来检查鼠标是否进入了组件的特定部分。为此,您应该在 MouseMotionListener
.
mouseMoved
而不是 MouseListener
class ... implements MouseMotionListener {
//...
public void mouseMoved(MouseEvent e) {
int mx = e.getX();
int my = e.getY();
int hudX = Game.WIDTH / 2 - 285;
int hudY = Game.HEIGHT / 2 - 170;
int hudW = Game.hud.materials[1].getWidth();
int hudH = Game.hud.materials[1].getHeight();
isOnMaterial[0] = mouseOver(mx, my, hudX, hudY, hudW, hudH);
}
}
请注意,这并不会真正通知光标是进入还是离开该区域,它只是检查光标当前是否在其中。
P.S。在代码中使用具有有意义名称的常量。像上面的 285 和 170 这样的幻数是不好的做法。