Java MouseListener进入并退出不会更新,除非我alt选项卡

时间:2017-12-13 15:19:11

标签: java exit mouselistener enter

我有这两个功能

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选项卡之后一直保持打印,而不仅仅是一次。 (因为游戏循环)

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

1 个答案:

答案 0 :(得分:1)

mouseEnteredmouseExited仅在鼠标作为整体进入或退出组件时调用。您无法使用它来检查鼠标是否已进入组件的特定部分。为此,您应该使用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这样的魔术数字是不好的做法。