Java eclipse事件系统仅在具有打印功能时有效

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

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

tomehack110 回答:Java eclipse事件系统仅在具有打印功能时有效

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

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

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

private final MouseManager mouseManager = new MouseManager();
本文链接:https://www.f2er.com/3152533.html

大家都在问