如何使复杂对象成为 Observable

Ebo*_*ike 2 java javafx observable

我有多个 JavaFX 窗格和画布,它们引用具有所需数据的复杂对象,我希望它们在对象更改时重绘。

这将要求对象是 Observable,但我使用哪个类?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() { ... }
}
Run Code Online (Sandbox Code Playgroud)

ComplexObject 应该扩展哪个类?是否有一些东西可以维护监听器列表并有类似 fireValueChangedEvent() 这样的东西,所以我可以让它通知所有监听器?

我在 JavaFX 中看到的一切似乎都是针对属性的,这在这里似乎不是正确的选择。

Jai*_*Jai 5

不太确定你所说的交换是什么意思,也不确定我是否理解你的意思。

class ComplexObject {
    private IntegerProperty value1 = new SimpleIntegerProperty();
    private IntegerProperty value2 = new SimpleIntegerProperty();
    private BooleanProperty internalChanged = new SimpleBooleanProperty(false);

    public ComplexObject() {
        this.internalChanged.bind(Bindings.createBooleanBinding(() ->
            this.internalChanged.set(!this.internalChanged.get()), this.value1, this.value2));
    }

    public IntegerProperty value1Property() { return this.value1; }
    public int getValue1() { return this.value1.get(); }
    public void setValue1(int value) { return this.value1.set(value); }

    public IntegerProperty value2Property() { return this.value2; }
    public int getValue2() { return this.value2.get(); }
    public void setValue2(int value) { return this.value2.set(value); }

    public void setNewValue1(int newValue) { /* What value is this??? */ }

    public BooleanProperty internalChangedProperty() { return this.internalChanged; }
}

class ComplexRenderer extends Canvas implements InvalidationListener {
    private ComplexObject complexObject;

    public void setComplexObject(ComplexObject complexObject) {
        this.complexObject = complexObject;
        complexObject.internalChangedProperty().addListener(this);
    }
    @Override public void invalidated(Observable observable) {
        // Something inside complex object changed
    }

    public void draw() { ... }
}
Run Code Online (Sandbox Code Playgroud)