即使在整个NSA监视的这段时间,实现JavaFX控件时也要牢记可观察性,这仍然是一个好主意。 与Swing相比,这在JavaFX中很容易实现。
旧时光
来自Swing,我习惯于花费大量精力和时间来使自定义控件变得可观察。 通常需要添加方法来添加和删除某种类型的侦听器。 此侦听器类型是一个新接口,该接口的单个方法接受了一个新的事件对象。 要发送此事件对象,控件必须在我的自定义控件中“触发”它,因此我最终编写了fireXYZ()方法。 要做很多工作只是为了让别人知道控件状态的某些方面已经改变。
新时代
在JavaFX中,通过使用属性和可观察的集合可以更轻松地实现可观察性。 在FlexGanttFX框架中,其控件的几乎每个属性都是属性,并且所有集合都是通过FXCollections类创建的,该类返回可观察的集合。 这很有意义,因为每个控件的属性总数定义了它的状态,并且该状态必须是可观察的,以便应用程序的其他部分(尤其是其他控件)可以对状态更改做出反应。
样板代码
使用属性的不利之处在于,您最终编写了许多样板代码,但仍然比Swing少。 如果是布尔型属性,它将如下所示:
public final BooleanProperty showStuff =new SimpleBooleanProperty(this, "showStuff", true);public final BooleanProperty showStuffProperty() {return showStuff;
}public final boolean isShowStuff() {return showStuff.get();
}public final void setShowStuff(boolean show) {showStuff.set(show);
}
是的,您应该完全遵循此编码约定。 对于名为xxx的属性,请提供名为xxxProperty()的属性访问器方法,名为setXXX()的设置器和名为getXXX()的获取器。 这是在JavaFX中使用它的方式,您应该坚持使用它。
使用集合时,通常至少会得到以下代码:
private final ObservableList<String> names =FXCollections.observableArrayList();public final ObservableList<String> getNames() {return names;
}
在JavaFX核心控件中,集合通常存储在一个属性中,以便可以用新集合替换整个集合。 到目前为止,我在控件中还没有真正看到对此的强烈要求,也没有这样做,这意味着我不必为此情况编写属性侦听器。
听众
现在,我们的控件属性是属性,我们可以通过向它们添加侦听器(使用lambda表达式)来轻松地对状态更改做出反应。
myControl.showStuffProperty().addListener(it -> showStuffChanged());myControl.getNames().addListener((Observable observable) -> namesChanged());
结论
在设计自己的自定义控件时,通过属性和可观察的集合在控件类中公开其状态。 这样,每个人都将能够以与整个JavaFX框架一致的方式观察控件的状态,并使其他开发人员能够无缝地将其控件/应用程序与您的控件集成在一起。
翻译自: https://www.javacodegeeks.com/2014/07/javafx-tip-5-be-observable.html