Цикл игнорирует нажатие кнопки и бежит в бесконечность, ничего не показывая - PullRequest
0 голосов
/ 12 января 2019

В одной итерации цикла я хочу показать кнопки (которые зависят от нескольких условий) и после нажатия на одну из них скрыть их. Цикл выполняется (работает в бесконечность), но без отображения кнопок.

Я пытался добавить EventFilter на сцену панели:

parentPane.getScene().addEventFilter(MouseEvent.MOUSE_CLICKED, event -> 
        System.out.println("Mouse clicked! " + event.getSource()));

Но это ничего не изменило.

Проблема включена в аналогичные части моего кода:

var button = new Button();
button.setOnMouseClicked(mouseEvent -> {
    // do some backend code and finally:
    parentPane.getChildren().removeAll(parentPane.getChildren());
});
parentPane.getChildren().add(checkButton); 

Включено в метод setPlayerAction (Player player, int round). И цикл выглядит так:

while(board.getAfterRaise() < board.getPlayersCount()) {
    System.out.println("Turn: " + turn);
    player = board.getPlayers().get(turn);
    if(board.canMove(player)) {
        setPlayerAction(player, round); // <- THIS METHOD SHOWS BUTTONS
    }
    turn = (turn + 1) % board.getPlayers().size();
}

Он должен дождаться решения игрока и остановиться после завершения раунда (алгоритм хорош). Он работает правильно, но не останавливается до нажатия кнопки и не показывает их.

Я поместил цикл в новую задачу, и теперь он показывает кнопки, но с задержкой - на консоли есть несколько строк на много (цикл запускается, выполняется несколько итераций (около 20-30) и на одной из них останавливается отображение кнопок и ждет щелчка).

var task = new Task<Void>() {
    @Override
    public Void call() {
        while(board.getAfterRaise() < board.getPlayersCount()) {
            System.out.println("Turn: " + turn);
            var player = board.getPlayers().get(turn);
            if(board.canMove(player))
                setPlayerAction(player, round);
            turn = (turn + 1) % board.getPlayers().size();
        }
        return null;
    }
};
new Thread(task).start();

Я поместил метод runGame () - который содержит метод с циклом и находится в initialize () - в lambda Platrofm.runLater ():

@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
    configureBoardPane();
    configureControlPane();
    playerPanes = new ArrayList<>(board.getPlacesCount());

    setSeats();
    Platform.runLater(() -> {
        runGame();
    });
}

Теперь цикл приостанавливается на первой итерации, но после нажатия кнопки не перемещается на вторую.

...