Java eclipse eventsystem работает только при наличии функции печати - PullRequest
1 голос
/ 06 ноября 2019

У меня есть класс, который обрабатывает все события мыши, поэтому очень легко проверить, нажата ли кнопка мыши, но, кажется, он работает только при добавлении этой строки: 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 кубедитесь, что это работает.

ПРИМЕЧАНИЕ:

  • Я показываю только метод обновления, потому что весь сценарий слишком длинный
  • Метод обновления вызывается каждый кадр
  • mouseManager объявлен выше с этой строкой: private static MouseManager mouseManager = new MouseManager();

Без System.out.println(mouseManager.getMouseX()); внизу Update, mouseManager.isLeftPressed() не работает. Так как это исправить?

И это может быть связано с вышеуказанной ошибкой, но даже с функцией println() mouseManager, похоже, не всегда обнаруживает нажатия мыши.

1 Ответ

0 голосов
/ 06 ноября 2019

Обновления мыши происходят в другом потоке, и для этого нет явной обработки. Скорее всего, вам нужны именно изменчивые поля, учитывая однонаправленный поток информации от MouseManager к вызывающей стороне:

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

В качестве отступления, вы должны рассмотреть вопрос о замене этого поля класса static на final instance-field (и далее, передавая его в качестве аргумента конструктора):

private final MouseManager mouseManager = new MouseManager();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...