装饰现有的类以支持javafx属性

时间:2018-11-01 17:09:17

标签: java javafx decorator

我有一个现有的类,我想对javafx不了解。是否有一种公认的装饰或改编方式,使其支持javafx属性?

我想做类似以下的事情(这显然是错误的):

public class FooWrapper {
    /**
     * Decorates a Foo instance with javafx stuff
     */
    private final Foo foo;

    public FooWrapper(Foo toWrap) {
        this.foo = toWrap;
    }

    private final StringProperty name = new SimpleStringProperty();

    public final StringProperty nameProperty() {
        return this.foo.getName();//?????
    }

    public final String getName() {
        return this.nameProperty().get();
    }

    public final void setFirstName(final String name) {
        this.nameProperty().set(name);
    }

}

public class Foo {
    /**
     * Basic class I want to keep ignorant of javafx
     */

    private String name = "hello";

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

1 个答案:

答案 0 :(得分:3)

使用javafx.beans.property.adapter包中的类。

public class Foo {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class FooAdapter {

    private final JavaBeanStringProperty name;

    public FooAdapter(Foo foo) {
        try {
            name = JavaBeanStringPropertyBuilder.create().bean(foo).name("name").build();
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException(ex);
        }
    }

    public final void setName(String name) {
        this.name.set(name);
    }

    public final String getName() {
        return name.get();
    }

    public final StringProperty nameProperty() {
        return name;
    }

}

如上所述,适配器属性要求基础对象遵循Java Bean约定的属性。但是,有一些方法可以定制将哪些方法用于吸气剂/设置剂。

adapter属性将从底层对象获取值,并且如果可写,则在更新时也会写入底层对象。如果它支持PropertyChangeListener,它也可以观察基础对象的更改。请注意,此功能是使用反射实现的;如果您使用的是模块,则需要向exports中添加适当的opens / module-info指令(有关详细信息,请参见各种属性的Javadoc,例如JavaBeanStringProperty