Украсьте существующий класс для поддержки свойств javafx - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть существующий класс, который я хочу игнорировать в 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 голосов
/ 01 ноября 2018

Используйте классы в пакете 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 для свойств. Тем не менее, есть способы настроить, какие методы использовать для получения / установки.

Свойство адаптера будет получать значение из базового объекта и, если оно доступно для записи, также записывать в базовый объект при обновлении. Он также может наблюдать базовый объект на предмет изменений, если он поддерживает PropertyChangeListener s. Обратите внимание, что эта функциональность реализована с использованием отражения; если вы используете модули, вам нужно добавить соответствующие директивы exports / opens к вашему module-info (подробности см. в javadoc, например, JavaBeanStringProperty).

...