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 选项卡后一直打印,不仅一次。 (由于游戏循环)

我希望我的问题很清楚,有什么想法吗?

mouseEnteredmouseExited 仅在鼠标作为一个整体进入或离开组件时被调用。您不能使用它来检查鼠标是否进入了组件的特定部分。为此,您应该在 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 这样的幻数是不好的做法。