我有这两个功能
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绘制矩形。这个矩形不会画画,除非我选择窗口,这样设置为全屏:
jf.setExtendedState(JFrame.MAXIMIZED_BOTH);
jf.setUndecorated(true);
这也适用于mouseExited
功能。因此,当我进入alt选项卡时,我看到绘制了矩形,当鼠标存在于该区域时,除非我再次选择选项卡,否则仍会绘制矩形。
另外我知道问题出现在这两个函数上,因为我在事件被触发时尝试了System.Out.Println()
某事,并且只在我的alt选项卡后打印一次,我还有一个{{1}在我绘制矩形的函数上,它在我的alt选项卡之后一直保持打印,而不仅仅是一次。 (因为游戏循环)
我希望我的问题很清楚,有什么想法吗?
答案 0 :(得分:1)
mouseEntered
和mouseExited
仅在鼠标作为整体进入或退出组件时调用。您无法使用它来检查鼠标是否已进入组件的特定部分。为此,您应该使用MouseListener
中的mouseMoved
而不是MouseMotionListener
。
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这样的魔术数字是不好的做法。