2016-11-11 85 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'方法。 –