Как вызвать метод для свойства bind - PullRequest
0 голосов
/ 04 мая 2018

Я знаю, как связать свойство, но как я могу связать вызов функции?

Например: у меня есть ObjectProperty, который указывает на файл. Теперь я хочу привязать путь к своей папке? Если значение ObjectProperty равно C:\\user\Desktop\text.txt, соединение должно указывать на C:\\user\Desktop.

Я думал, что смогу позвонить getParentFile() в привязке.

1 Ответ

0 голосов
/ 04 мая 2018

Существует множество способов сопоставления ObjectProperty, взгляните на класс Bindings.

(Все примеры предполагают, что у вас есть ObjectProperty<File> file)

  1. Bindings.createObjectBinding(Callable<T> func, Observable... dependencies)

    ObjectBinding<File> parent = Bindings.createObjectBinding(() -> {
        File f = file.getValue();
        return f == null ? null : f.getParentFile();
    }, file);
    
  2. Bindings.select(ObservableValue<?> root, String... steps)

    ObjectBinding<File> parent = Bindings.select(file, "parentFile");
    

    Это выведет предупреждение в потоке ошибок, когда file равно нулю.

Вы также можете создать свой собственный метод отображения (который похож на createObjectBinding):

public static <T,R> ObjectBinding<R> map(ObjectProperty<T> property, Function<T,R> function) {
    return new ObjectBinding<R>() {
        {
            bind(property);
        }
        @Override
        protected R computeValue() {
            return function.apply(property.getValue());
        }
        @Override
        public void dispose() {
            unbind(property);
        }
    };
}

И используйте его

ObjectBinding<File> parent = map(file, f -> f == null ? null : f.getParentFile());
...