强制使 JavaFX 属性失效
Force invalidation of JavaFX properties
我有一个 class 和 getters/setters 用于与底层设备驱动程序交互。 getter 从设备读取数据,setter 将数据写入设备。我会向此 class 添加一个 FX 属性 以绑定到 GUI 控件。我使用 JavaBeanPropertyBuilder 构建了 属性,它可以正常工作。但是 属性 值不仅可以在 GUI 端更改,还可以在设备端更改,因此我需要通过计时器更新属性,并且我希望强制使属性无效以更新所有绑定。可能吗?
UPD 代码示例:
class MyDevice {
public double getSpeed() {
return (double)driver.getParameter("speed");
}
public void setSpeed(double value) {
driver.setParameter("speed", value);
}
private DoubleProperty speed = new JavaBeanDoublePropertyBuilder().bean(this).name("speed").build();
public DoubleProperty speedProperty() {
return speed;
}
}
现在,我将 MyDevice::speedProperty
绑定到 GUI 控件,如果在驱动程序端更改了一个值,我想要 speedProperty.invalidate()
之类的东西来强制处理所有已注册的侦听器并更新绑定。 (例如,我通过计时器查询设备状态了解驱动程序端的更改,但不是所有可用参数。)
简短的回答是肯定的。但是,如果您没有更具体地说明您的用例,那么只有一些一般性建议:
- 您可以向 属性 添加一个
InvalidationListener
`,只要绑定 属性 改变它的值 就会调用它
- 您可以考虑绑定 属性
bidirectional
,这样任一方向的变化都会反映在另一侧。
- 然而,双向绑定可能并不可取,在这种情况下,您可以注册一个
ChangeListener
to the Property
.
fireValueChangedEvent
方法可用于通知 JavaBeanDoubleProperty
基础数据已更改。
private JavaBeanDoubleProperty speed = new JavaBeanDoublePropertyBuilder().bean(this).name("speed").build();
speed.fireValueChangedEvent();
我有一个 class 和 getters/setters 用于与底层设备驱动程序交互。 getter 从设备读取数据,setter 将数据写入设备。我会向此 class 添加一个 FX 属性 以绑定到 GUI 控件。我使用 JavaBeanPropertyBuilder 构建了 属性,它可以正常工作。但是 属性 值不仅可以在 GUI 端更改,还可以在设备端更改,因此我需要通过计时器更新属性,并且我希望强制使属性无效以更新所有绑定。可能吗?
UPD 代码示例:
class MyDevice {
public double getSpeed() {
return (double)driver.getParameter("speed");
}
public void setSpeed(double value) {
driver.setParameter("speed", value);
}
private DoubleProperty speed = new JavaBeanDoublePropertyBuilder().bean(this).name("speed").build();
public DoubleProperty speedProperty() {
return speed;
}
}
现在,我将 MyDevice::speedProperty
绑定到 GUI 控件,如果在驱动程序端更改了一个值,我想要 speedProperty.invalidate()
之类的东西来强制处理所有已注册的侦听器并更新绑定。 (例如,我通过计时器查询设备状态了解驱动程序端的更改,但不是所有可用参数。)
简短的回答是肯定的。但是,如果您没有更具体地说明您的用例,那么只有一些一般性建议:
- 您可以向 属性 添加一个
InvalidationListener
`,只要绑定 属性 改变它的值 就会调用它
- 您可以考虑绑定 属性
bidirectional
,这样任一方向的变化都会反映在另一侧。 - 然而,双向绑定可能并不可取,在这种情况下,您可以注册一个
ChangeListener
to theProperty
.
fireValueChangedEvent
方法可用于通知 JavaBeanDoubleProperty
基础数据已更改。
private JavaBeanDoubleProperty speed = new JavaBeanDoublePropertyBuilder().bean(this).name("speed").build();
speed.fireValueChangedEvent();