循环会忽略Button的onclick并进入无限状态而不会显示任何内容

时间:2019-01-12 18:59:25

标签: java multithreading javafx onclick pane

在循环的一次迭代中,我想显示按钮(取决于一些条件),然后单击其中的一个按钮将其隐藏。循环执行(运行到无穷远),但不显示按钮。

我试图将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();
    });
}

现在循环在第一次迭代时暂停,但单击按钮后不会移至第二个。

0 个答案:

没有答案