2017-05-31 73 views
2

我想創建一組使用JavaFX 8的自定義控件。我有點困惑什麼是正確的方式來做一些東西,如佈置我定義的孩子建立我的控制。 我用來重寫layoutChildren()方法,在這裏我重新定位並調整了孩子的大小;但閱讀javadoc的layoutChildren()有寫:JavaFX 8 - 自定義控件和他們的孩子

在佈局過程中調用佈局在此父級中的子級。默認情況下,它只會將受管理的可調整大小的內容設置爲其首選大小,並且不會執行任何節點定位。

因此,根據文檔,我不得執行子節點的任何重定位(「節點定位」)。

我想了解的是在我的自定義控件中定位和調整兒童大小的正確方法是什麼。

我不明白的另一件事是layoutChildren()被調用的時間和次數;文檔說「在佈局階段調用」,但我不明白何時執行「佈局階段」。

我希望你能幫助我。


編輯@James_D

這是一個例子我在評論說

public class MyControl extends TextField { 
    private Label label; 

    public MyControl() { 
     super(); 
     setSkin(new TextFieldSkin(this)); 

     label=new Label("This is my custom textfield"); 
     getChildren().add(label); 
    } 

    @Override 
    protected void layoutChildren() { 
     super.layoutChildren(); 
     label.relocate(0, -label.getHeight()); 

     System.out.println("I'm laying out children"); 
    } 
} 

如果你運行它,你會發現,layoutChildren()被調用每幀

+0

因此,你建議我在重寫方法,我可以做節點定位?這似乎違反了超級合同。 – Vin

+0

「默認情況下,x確實......」不是合同。在這種特殊情況下,Javadocs明確告訴你,如果需要的話,子類應該定位節點:「子類應該覆蓋此函數以根據需要佈置內容。」 –

+0

我們可以有一個自定義佈局管理器如何工作的想法或形象嗎?編寫類似代碼的可能性很高,因此我們可以提供幫助。 – GOXR3PLUS

回答

3

您誤解了Javadocs you quoted,它描述了Parent.layoutChildren()的作用。它並不是說子類不能定位節點;實際上接下來的句子是

子類應該重寫此函數以根據需要佈局內容。

所以這正是您應該重寫以便佈置子節點的方法。

我不明白何時執行「佈局傳遞」。

package documentation for javafx.scene.layout

場景圖形佈局機構由系統一旦應用程序創建和顯示一個Scene自動驅動。場景圖檢測到影響佈局的動態節點變化(例如大小或內容的變化),並調用requestLayout(),該變量將分支標記爲需要佈局,以便在下一個脈衝時,在該分支上執行自頂向下的佈局傳遞在該分支的根上調用layout()。在佈局過程中,layoutChildren()回調方法將在每個父級上調用以佈局其子級。該機制旨在通過確保多個佈局請求合併並一次處理,而不是在每分鐘更改時執行重新佈局,從而最大限度地提高佈局效率。因此,應用程序不應直接在節點上調用佈局。

所以父節點將「自動」(*)標記本身爲需要佈局如果任何其子項的大小或內容節點的變化。在每個渲染脈衝上,如果父級需要佈局,則將調用layoutChildren()方法。這意味着你所要做的就是實現layoutChildren()方法,它將在需要時爲你調用。 (*)雖然我沒有真正看到源代碼,但是我對這種工作原理的理解是,父代綁定到其子節點的佈局邊界:如果任何子節點的邊界失效,然後它在下一個渲染脈衝上重新計算其佈局。反過來,如果內容改變(例如,如果文本改變,標籤將使其佈局邊界失效等),則節點將使其自己的佈局邊界失效。換句話說,JavaFX observable properties and bindings驅動佈局機制。

所以(TL; DR)的Parent子類的layoutChildren()方法(或Region,甚至Pane,這取決於你所需要的功能),正是重新調整和重新定位的子節點的正確位置。如果(且僅當)父級需要重新計算其佈局,每次場景呈現時都會調用該方法。

+0

有用的答案,謝謝。但是我注意到,在某些情況下,如果我將println()放入方法中,則會在每個幀上調用該方法。我認爲這不是一種正確的行爲,因爲看起來佈置孩子會導致幕後調整控制佈局,等等......我不知道你是否理解我的意思。 – Vin

+0

@Vin我需要看到發生的一個例子。 –

+0

這是diffucult顯示,因爲它是很多的代碼,我會嘗試以更簡單的代碼重現此行爲。 – Vin

相關問題