java eclipse 事件系统只有在有打印功能时才有效

The java eclipse eventsystem only works when there is a print function

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

鼠标管理器class:

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 class 非常简单,但它用于在其他 classes 中调用以使鼠标输入更容易。 但是 在 Visuals class 中(这不是一个合适的名称,它更像是主要的 class)事情出错了。

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 以确保其有效。

注意:

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

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

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

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

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

private final MouseManager mouseManager = new MouseManager();