2009-02-09 105 views
7

有沒有辦法強制JavaFX應用程序在繼續之前重新繪製自己?類似於Swing Panel的繪圖(Graphic g)方法(我可能會在這裏找到關鍵字錯誤)。在JavaFX中強制立即繪製

請考慮以下示例:您需要編寫一個TicTacToe應用程序以及計算機播放器所需的AI。你想要顯示兩個電腦玩家的能力。也許你會在電腦輪流之間停下兩秒鐘,讓它像生活一樣。當你點擊你的「Go」按鈕時,會出現很大的無反應停頓時間(用9秒的時間通過僞造的暫停讓計算機「決定」),然後突然應用程序的視覺更新爲已完成遊戲的狀態。

一旦在應用程序的線程中處理完成,JavaFX似乎就會重新繪製?我在這裏並不完全確定。

謝謝!

+0

我相信Swing和JavaFX在GUI組件中有類似的線程模型, Swing的JPanel,JavaFx Button,只能從主線程中更新。在上面的示例中,您將創建獨立的線程來執行計算,即移動,然後調用Swing.invokeLater或Platform.runLater()以獲取主線程來更新GUI。雖然這聽起來很奇怪,但這樣做是爲了規避如果任何線程被允許更新GUI時會發生的問題。 – Kerry 2015-08-14 11:27:14

回答

6

你說得對。 JavaFX是事件驅動和單線程的。這意味着重繪和事件響應不能同時完成。長時間運行的任務應該在單獨的線程上執行,這樣它們不會阻塞UI的渲染,當任務完成時,它可以通過調用FX.deferAction()來同步回FX線程,FX.deferAction()將簡單地執行主線程上的代碼線。

1

這不會是最有幫助的答案,因爲我已經在JavaFX中玩了半天,但是不會使用時間軸,關鍵幀和綁定來完成重繪,而不是像你一樣明確地調用它們有描述嗎?

請參閱this tutorial for an example

1

JavaFX的模型是將您與屏幕上「東西」的繪畫分開。這是非常強大的,但是從你可能熟悉的方面來看是一個改變。

whaley是正確的,在JavaFX中這樣做的適當方式是製作一個時間線,每隔X秒完成一次移動,並在該關鍵幀處繪製。

如果您有關於如何執行此操作的問題,請嘗試使用一些代碼創建一個新問題。