我有一个处理所有鼠标事件的类,这样可以很容易地检查鼠标按钮是否被单击,但它似乎只有在我添加此行时才起作用:system.out.println(mouseManager.getMouseX());

MouseManager 类:

public class MouseManager implements MouseListener, MouseMotionListener { 
 
    private boolean leftPressed, rightPressed; 
    private int mouseX, mouseY; 
 
    public MouseManager() { 
 
    } 
 
    public boolean isLeftPressed() { 
        return leftPressed; 
    } 
 
    public boolean isRightPressed() { 
        return rightPressed; 
    } 
 
    public int getMouseX() { 
        return mouseX; 
    } 
 
    public int getMouseY() { 
        return mouseY; 
    } 
 
    @Override 
    public void mouseMoved(MouseEvent e) { 
        mouseX = e.getX(); 
        mouseY = e.getY(); 
 
    } 
 
    @Override 
    public void mousePressed(MouseEvent e) { 
        if (e.getButton() == MouseEvent.BUTTON1) { 
            leftPressed = true; 
        } 
        else if (e.getButton() == MouseEvent.BUTTON3) { 
            rightPressed = true; 
 
        } 
    } 
 
} 

正如您所看到的,MouseManager 类非常简单,但它用于在其他类中调用以使鼠标输入更容易。 但是在 Visuals 类(这不是一个合适的名称,它更多的是主类)中出现了问题。

public void Update() { 
    if (mouseManager.isLeftPressed()) { 
        Vector2 posClicked = GetRoundedMousePos(); 
        int index = GetPosInArray(posClicked); 
        System.out.println(Grid.cells.get(index).cellType.toString()); 
 
        if (Grid.cells.get(index).cellType == Cell.CellType.GROUND) { 
            Grid.cells.get(index).cellType = Cell.CellType.SAND; 
            repaint(); 
        } 
    } 
    System.out.println(mouseManager.getMouseX()); 
} 

如您所见,我添加了 prinln 以确保其正常工作。

注意:

  • 我只展示了Update方法,因为整个脚本太长了
  • 每一帧都会调用 Update 方法
  • mouseManager 在上面用以下行声明:private static MouseManager mouseManager = new MouseManager();

如果 Update 底部没有 System.out.println(mouseManager.getMouseX());mouseManager.isLeftPressed() 将不起作用。那么如何解决这个问题呢?

AND这可能与上面的错误有关,但即使使用println()函数,mouseManager似乎并不总是检测到鼠标按下。

请您参考如下方法:

鼠标更新发生在另一个线程上,并且没有对此进行显式处理。考虑到从 MouseManager 到调用者的单向信息流, volatile 字段可能就是您所需要的:

private volatile boolean leftPressed, rightPressed; 
private volatile int mouseX, mouseY; 

顺便说一句,您应该考虑用 final 实例字段替换该 static 类字段(并且进一步将其作为构造函数参数传递):

private final MouseManager mouseManager = new MouseManager(); 


评论关闭
IT源码网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!