所以我得到了使用JavaFX构建的这款游戏,并且我在使用gui时遇到了一些问题。当用户点击一个按钮时,会触发事件处理程序。这是该事件处理程序psudo代码:Java FX仅在事件处理程序完成时更新GUI
When button is clicked
try to make a move
update the board with the new move
let the AI make a move
update the board with the ai's move
这里的问题是,最后一行已执行后的板只更新,所以你从来没有真正看到了人的球员后,董事会已使他或她的。我读过一些关于做gui的东西
Platform.runLater(() -> {
});
但这似乎不适用于我。我在这里错过了什么?
编辑这是我的代码:
@FXML
public void btnCell(ActionEvent actionEvent) {
disableAllButtonsDuringAITurn(board.getCells());
Node sourceNode = (Node) actionEvent.getSource();
String cellId = sourceNode.getId();
int row = Character.getNumericValue(cellId.charAt(3));
int col = Character.getNumericValue(cellId.charAt(4));
board = treeBuilder.getFlippedBoard(board, row, col, Cell.Black, Cell.White);
playTurn();
}
private void playTurn() {
updateView(board.getCells());
checkWinner();
try {
Thread.sleep(1500);
} catch (InterruptedException e) {
e.printStackTrace();
}
MakeAIMove();
updateView(board.getCells());
updateAvailableMovesForHuman();
checkWinner();
if (!canHumanMakeTurn) {
playTurn();
}
}//Only here is the view updated.
你如何期望它从用户的角度来看?用户应该看到什么?是否包含任何动画?人工智能需要多长时间来计算移动? – jewelsea
AI可能会在没有任何用户输入的情况下进行移动,从用户的角度来看可能实际上是瞬间的。所以,在用户完成所有输入后,系统可以立即执行AI移动的计算,并显示包括两个玩家移动的棋盘结果。 – jewelsea
为了防止出现这种情况,您可以在用户进行移动并更新主板之后阻止用户输入,然后运行PauseTransition来安排仿真延迟(或者如果您想要关闭JavaFX应用程序线程的计算,则运行任务)以及暂停或任务完成后,更新董事会以反映人工智能移动。效果将会是用户做出动作,更新用户界面,暂停发生,在此期间用户无法做出新的动作,人工智能进行移动并更新板,之后用户可以进行新的移动。那是你要的吗? – jewelsea