2014-12-13 102 views
2

簡而言之,我可以管理:鑑於我需要節點的佈局信息(渲染節點的實際高度/寬度)來計算我的動畫,我怎樣才能獲得該信息在javafx繪製一個框架之前?在不知道佈局的情況下計算JavaFX動畫值

長一點的解釋:

我有一個具有出現在它(在前面)子項的TreeItem。我想要的是一個動畫,可以讓所有現有的孩子滑下來,爲可能滑入的新項目騰出空間。每個子項目內容都是不同的,只有在運行時才知道,這意味着每個子樹項目不能表示爲常量。

這讓我沿着這些線路編寫代碼:

groupController.groupTreeItem.getChildren().addListener(
     new ListChangeListener<TreeItem<Node>>() { 
      @Override public void onChanged(Change<? extends TreeItem<Node>> c) { 
       while(c.next()){ 
        if (! c.wasAdded()){ 
         continue; 
        } 

        TreeItem newItem = c.getAddedSublist().get(0) 

        new Timeline(
         new KeyFrame(
          seconds(0), 
          new KeyValue(view.translateYProperty(), -1 * newItem.getHeight()) 
         ), 
         new KeyFrame(
          seconds(1), 
          new KeyValue(view.translateYProperty(), 0) 
         ) 
        ); 
       } 
      } 
     } 
); 

這裏的問題是,作爲當treeItem添加到另一個,它的成分不被時間奠定了失效事件被激發,意思newItem.view.getHeight()返回0.

我的下一個想法是,然後動畫執行作爲對列表內容的變化和高度屬性的順序變化的反應(這讓我寫了一些非常可怕的代碼,我寧願不分享 - 聽衆加入聽衆是不是我真的想寫的東西)。這幾乎可以工作,除了javaFX將繪製一個高度屬性設置的框架,但沒有應用動畫翻譯。我可以進一步破解這條路,並嘗試解決不透明的問題,並在稍後將工作排入隊伍,但我認爲這將成爲瘋狂的道路。

我想知道是否有一些僞類foo或一些佈局屬性的巧妙使用,我可以用它來幫助我。我一直在各種各樣的財產的各種組合,並沒有得到任何地方。看起來只要組件具有高度,就會呈現該組件,而不管您放入或圍繞該高度分配的任何聽衆。

任何幫助非常感謝!

+1

有一件事我通常在這種情況下是「悄悄地」渲染對象的地方,用戶無法看到,而一旦它完成渲染,然後我得到屬性,從而允許繼續進行適當的動畫。你也許可以將一個監聽器附加到你的舞臺'.setOnShown()'上,我相信,然後在那個監聽器中處理你的動畫,因爲它會被顯示出來。但是,您可能會發現一些奇怪的構造類型的事情。雖然我懷疑它 – WillBD 2014-12-17 15:48:23

+0

啊這很聰明。它有點破解,但我不知道它會如何引起問題,除非隱藏的組件以某種方式以不同於實際屏幕的方式佈置節點,並且這應該不太難以避免。我會試試這個。非常感謝! – Groostav 2014-12-17 19:19:02

+0

與Will類似,有時我會向節點添加一個sceneProperty失效偵聽器,在接口中使用默認方法時,主要運行檢查if(getScene()!= null){logic}。我認爲你的情況可能會受益於一些默認值,以及... – jdub1581 2014-12-19 04:49:41

回答

0

你嘗試過,覆蓋這個

@Override 
protected void updateBounds() { 
    super.updateBounds(); 
} 
+0

那麼有趣的是,在'Node'基類這是一個內部方法,這意味着我不會覆蓋它,但節點的公共子類窗格,區域等)都將其可見性提高到受保護狀態,這意味着我們可以覆蓋它。我給了這一槍。 – Groostav 2015-07-08 16:52:07

相關問題