强制使 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();