我不會爲此重寫任何方法。如果你想創建的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
)。
在這兩種情況下,都沒有任何東西阻止用戶窗體干涉「BackgroundEffectPane」的內部工作,對吧?他們總是可以隨意使用我從父類或構造函數返回的樹。 –
在後一種情況下,它需要一個沮喪的(基本上是一個信仰的飛躍),因爲'Parent'只暴露了一個不可修改的兒童名單,但是,一般來說這是真的。第二種方法在允許您更改實現而不破壞使用它的其他代碼時更靈活(您並未承諾在該版本中始終使用「StackPane」)。 –
如果你真的想使用子類化方法,可以考慮繼承'Region'並重寫'layoutChildren()'和'計算Pref/Min/Max Width/Height'方法。 –