我有一个处理所有鼠标事件的类,这样很容易检查是否单击了鼠标按钮,但是它似乎仅在添加以下行时起作用: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();


如果在更新底部没有System.out.println(mouseManager.getMouseX());,则mouseManager.isLeftPressed()不起作用。那么如何解决呢?

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

最佳答案

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

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


顺便说一句,您应该查看将static类字段替换为final实例字段(此外,将其作为构造函数参数传入):

private final MouseManager mouseManager = new MouseManager();

08-19 06:31