2017-11-17 416 views
0

我想實現這樣的使用JavaFX程序從函數返回:等待PathTransition完成,直到JavaFX的

我們擁有一批現場Foo類型的對象(這是由所示界)。
它們中的每一個都有一個名爲move()的方法,它可以將對象移動到場景中的另一個位置。然後它找到另一個對象(通過調用另一個方法)並在找到的對象上調用move方法。這件事情是這樣的:

class Foo { 
    Circle circle; 
    void move() { 
     // change circle location 
     // HERE, I WANT TO WAIT UNTIL CIRCLE HAS MOVED ON THE SCENE 
     Foo f = findNextFoo(); 
     foo.move(); 
    } 
} 

我想圓運動是可見的和連續的用戶,但是當我經常使用PathTransition,所有對象的移動,在(幾乎)同時,由於每個PathTransition正在運行一個新線程,並且在其play()之後,函數將繼續並調用findNextFoo()方法。

我已經嘗試使用setOnFinished作爲PathTransition來更改標誌,當它完成後,然後使用while(true)等待,直到標誌被設置爲true,然後調用foo.move()方法。這也不起作用,並使我的程序崩潰。

Thread.sleep()方法也沒有工作,我想要的方式(所有的動作都是一個延遲之後,但在同一時間內完成)。

任何幫助,將不勝感激,謝謝。

回答

0

像你這樣的,如果你使用while(true)Thread.sleep你不能阻止應用程序線程。

如果你能事先確定的所有過渡您可以使用SequentialTransition

但是使用onFinished事件可能會需要的代碼的改動較小。只需從事件處理程序開始下一個轉換,而不是使用標誌+無限循環:

void move() { 
    PathTransition transition = ... 

    transition.setOnFinished(event -> { 
     // after transition is finished continue with next one 
     Foo f = findNextFoo(); 
     foo.move(); 
    }); 
    transition.play(); 
} 
+0

非常感謝您的幫助。等待轉換完成從函數返回後怎麼辦? – Karegar

+0

不,你不能這樣做,因爲你阻塞了負責執行動畫和'onFinished'處理程序的應用程序線程。 (除非你使用非公開的API或java9的API,見https://stackoverflow.com/questions/46369046/how-to-wait-for-user-input-on-javafx-application-thread-without-using -showandwai) – fabian