2016-11-11 61 views
0

使用我學習的東西,看看this answer,我想實現一個自定義窗格。這個窗格的主要目的,叫做BackgroundEffectPane,將採取一種效果並且僅將其應用於背景。這將允許我以更簡潔的方式在鏈接的答案中實現半透明背景StackPane。在JavaFX中擴展窗格

到目前爲止,我已閱讀了文檔PaneNode。到目前爲止,我沒有看到任何明顯的方法來覆蓋,儘可能乾淨地做到這一點。唯一引起我關注的是Pane中的getChildren()方法。

這是否是正確的覆蓋?

是面向子類的正確類嗎?

TLDR:嘗試創建自定義窗格,我重寫哪些方法。我所要做的就是將效果添加到背景中。

回答

1

我不會爲此重寫任何方法。如果你想創建的StackPane提供此功能的一個子類,只需調用getChildren().addAll(...)在構造函數中:

public class BackgroundEffectPane extends StackPane { 

    public BackgroundEffectPane(Node content) { 
     getChildren().addAll(createBackground(), freeze(...), content); 
    } 

    // code refactored from other answer... 
} 

當然,現在你不再真的需要在所有子類:

public class BackgroundEffectPane { 

    private final Node content ; 

    private final Parent effectPane ; 

    public BackgroundEffectPane(Node content) { 
     this.content = content ; 
     this.effectPane = new StackPane(createBackground(), freeze(...), content); 
    } 

    public Parent getEffectPane() { 
     return effectPane ; 
    } 

    // other code... 
} 

這通過不暴露窗格的底層實現和效果來更好地封裝類(即,API不會公開您使用的是StackPane)。

+0

在這兩種情況下,都沒有任何東西阻止用戶窗體干涉「BackgroundEffectPane」的內部工作,對吧?他們總是可以隨意使用我從父類或構造函數返回的樹。 –

+1

在後一種情況下,它需要一個沮喪的(基本上是一個信仰的飛躍),因爲'Parent'只暴露了一個不可修改的兒童名單,但是,一般來說這是真的。第二種方法在允許您更改實現而不破壞使用它的其他代碼時更靈活(您並未承諾在該版本中始終使用「StackPane」)。 –

+1

如果你真的想使用子類化方法,可以考慮繼承'Region'並重寫'layoutChildren()'和'計算Pref/Min/Max Width/Height'方法。 –