2017-09-15 66 views
0

所以我得到了使用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. 
+0

你如何期望它从用户的角度来看?用户应该看到什么?是否包含任何动画?人工智能需要多长时间来计算移动? – jewelsea

+0

AI可能会在没有任何用户输入的情况下进行移动,从用户的角度来看可能实际上是瞬间的。所以,在用户完成所有输入后,系统可以立即执行AI移动的计算,并显示包括两个玩家移动的棋盘结果。 – jewelsea

+0

为了防止出现这种情况,您可以在用户进行移动并更新主板之后阻止用户输入,然后运行PauseTransition来安排仿真延迟(或者如果您想要关闭JavaFX应用程序线程的计算,则运行任务)以及暂停或任务完成后,更新董事会以反映人工智能移动。效果将会是用户做出动作,更新用户界面,暂停发生,在此期间用户无法做出新的动作,人工智能进行移动并更新板,之后用户可以进行新的移动。那是你要的吗? – jewelsea

回答

1

你正在做的AI在一个连续的方法在事件线程上移动。所以JavaFX没有机会访问UI线程来进行更新。

使它成为另一个线程。

new Thread(()-> { 
    AI logic; 
    Platform.runLater(() -> { 
     update UI after ai move 
    }); 
}) 
+0

但是在我让AI做出这个举动之前,它不应该能够更新GUI吗?看看我更新的问题。我希望它是连续的。 – nuff3

+0

@ nuff3只有一个UI线程。当你使用它时,没有人不能更新任何东西。这就是为什么在任何地方声明除了在该线程上更新UI之外不做任何工作。在你的代码中,你甚至可以在UI线程上调用'Thread.sleep()',自动冻结你的应用1.5秒。 –

相关问题