【发布时间】:2017-02-07 06:56:06
【问题描述】:
我有多个 JavaFX 窗格和画布,它们引用了一个包含所需数据的复杂对象,我希望它们在对象更改时重绘。
这将要求对象是可观察的,但我应该使用哪个类? JavaFX 似乎主要有 ObservableValue 子类,它们包装一个值并允许将其换出。我不想换掉复杂的对象,只是在发生变化时通知侦听器。我可以通过实现addListener 来做到这一点,但我确信已经有一个子类可以为我做到这一点。
class ComplexObject /* extends SomeObservableClass */ {
public int getValue1 { complex calculations... };
public int getValue2 { ... };
public void setNewValue1(int newValue) { ... }
}
class ComplexRenderer extends Canvas implements InvalidationListener {
private ComplexObject complexObject;
public void setComplexObject(ComplexObject complexObject) {
this.complexObject = complexObject;
complexObject.addListener(this);
}
public void draw() { ... }
}
ComplexObject 应该扩展哪个类?是否有一些东西可以维护监听器列表并有类似 fireValueChangedEvent() 的东西,所以我可以让它通知所有监听器?
我在 JavaFX 中看到的一切似乎都是针对属性的,这似乎不是正确的选择。
【问题讨论】:
-
不太清楚“不能交换”是什么意思。我不确定您的意思是交换整个
ComplexObject还是其中的一些值。getValue()只在调用时才需要计算吗?还是可以在调用之前计算和存储? -
"Cannot swap" 表示我想保持相同的
ComplexObject,只需更改其中的值即可。在我看来,ObjectPropertyBase及其朋友被设计为包装器,因此您通过set()替换整个对象,然后将触发失效侦听器。我可以存储复杂的计算并将结果作为单独的属性公开,但最初的意图是只拥有复杂的对象并按需进行计算。 -
这意味着我的答案应该接近你正在寻找的。您不会跟踪
ComplexObject参考中的更改。相反,您跟踪其内部值(要装箱的基元)和对象的引用的变化。如果您需要跟踪单个属性,则需要向它们添加单个侦听器。否则,您可以公开一个BooleanProperty,您可以侦听任何属性的任何更改。当然,在内部,您需要将这些属性绑定到BooleanProperty。
标签: java javafx observable