在循环的一次迭代中,我想显示按钮(取决于一些条件),然后单击其中的一个按钮将其隐藏。循环执行(运行到无穷远),但不显示按钮。
我试图将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();
}
它应该等待玩家的决定,并在回合结束时停止(算法很好)。 它可以正常工作,但要等到单击按钮并且不显示它们时才能暂停。
我将循环放到新的Task中,现在它显示了按钮,但是有延迟-在控制台上有几行到很多(循环开始,进行一些迭代(大约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();
我在lambda Platrofm.runLater()中放置了方法runGame()-包含带有循环的方法,并且位于initialize()中。
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
configureBoardPane();
configureControlPane();
playerPanes = new ArrayList<>(board.getPlacesCount());
setSeats();
Platform.runLater(() -> {
runGame();
});
}
现在循环在第一次迭代时暂停,但单击按钮后不会移至第二个。