В одной итерации цикла я хочу показать кнопки (которые зависят от нескольких условий) и после нажатия на одну из них скрыть их. Цикл выполняется (работает в бесконечность), но без отображения кнопок.
Я пытался добавить 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();
});
}
Теперь цикл приостанавливается на первой итерации, но после нажатия кнопки не перемещается на вторую.