首页 > 解决方案 > 如何从 ObservableValue 继承?

问题描述

我有一个包含各种属性的类:

public class Foo extends ??? {
    public SimpleBooleanProperty prop1 = new SimpleBooleanProperty();
    public SimpleStringProperty prop2 = new SimpleStringProperty();

    // ** more properties ** //
}

在大多数情况下,所有属性都会更改,对于某些侦听器来说,当任何属性更改时只调用一个回调然后获取所有属性的值(即使不是所有属性都更改)会容易得多。我应该建立在什么类上?

我想用类似的东西注册一个听众

Foo foo = new Foo();
foo.addListener( new ChangeListener< >() {
      void onChange(Foo newValue,Foo oldValue) {
           System.out.println(String.valueOf(newValue.prop1.get());
           System.out.println(String.valueOf(newValue.prop2.get());
      });

打印到控制台只是一个例子,重点是监听器只需要知道发生了什么变化,调用 getter 就可以了。我有点迷失从哪里开始。有Observable接口和大量不同的基类(例如ObservableValueBase<T>or SimpleObjectProperty<T>)。我应该继承/扩展哪一个?

标签: javajavafxproperties

解决方案


不完全确定我是否正确解释了您的需要。这可能是您需要的:

public class Foo extends ??? {
    public SimpleBooleanProperty prop1 = new SimpleBooleanProperty();
    public SimpleStringProperty prop2 = new SimpleStringProperty();

    // ** more properties ** //

    private final ObjectBinding<Void> binding = Bindings.createObjectBinding(this::bar, prop1, prop2, prop3, prop4);

    private final Void bar() {
        Optional.of(newValue.prop1.get()).ifPresent(System.out::println);
        Optional.of(newValue.prop2.get()).ifPresent(System.out::println);
        Optional.of(newValue.prop3.get()).ifPresent(System.out::println);
        Optional.of(newValue.prop4.get()).ifPresent(System.out::println);

        return null;
    }
}

绑定本身会为您进行侦听,但您必须保留绑定的强引用,否则它将被垃圾收集。


推荐阅读