gpt4 book ai didi

java - 如何使一个复杂的对象成为 Observable

转载 作者:行者123 更新时间:2023-11-30 07:56:31 26 4
gpt4 key购买 nike

我有多个 JavaFX Pane 和 Canvas ,它们引用一个包含所需数据的复杂对象,我希望它们在对象更改时重绘。

这会要求对象是 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() { ... }
}

ComplexObject 应该扩展哪个类?是否有维护听众列表并具有类似 fireValueChangedEvent() 的东西,以便我可以让它通知所有听众?

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

最佳答案

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

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() { ... }
}

关于java - 如何使一个复杂的对象成为 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42083567/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com