gpt4 book ai didi

Java MouseListener 输入和退出不会更新,除非我使用 Alt Tab

转载 作者:行者123 更新时间:2023-12-02 11:52:18 25 4
gpt4 key购买 nike

我有这两个功能

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 Tab 键切换窗口,否则该矩形不会绘制,该窗口设置为全屏,如下所示:

jf.setExtendedState(JFrame.MAXIMIZED_BOTH); 
jf.setUndecorated(true);

这也适用于 mouseExited 函数。因此,当我按下 Alt Tab 键时,我会看到绘制了矩形,并且当鼠标存在于该区域时,除非再次按下 Tab 键,否则仍会绘制矩形。

我也知道问题出在这两个函数上,因为我尝试在触发事件时执行 System.Out.Println() 某些操作,并且在我使用 alt tab 后它仅在控制台上打印一次,并且我在绘制矩形的函数上还有一个 System.Out.Println() ,并且在我使用 alt tab 后它会一直打印,而不仅仅是一次。 (因为游戏循环)

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

最佳答案

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);
}
}

请注意,这并不会真正通知光标是否进入或离开该区域,它只是检查光标当前是否位于该区域中。

附注在代码中使用具有有意义名称的常量。像上面的 285 和 170 这样的神奇数字是不好的做法。

关于Java MouseListener 输入和退出不会更新,除非我使用 Alt Tab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47796536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com