У меня есть ситуация, когда я хочу связать BooleanProperty
с непустым состоянием ObservableList
, обернутым внутри ObjectProperty
.
Вот основной синопсис поведения, которое я ищу:
ObjectProperty<ObservableList<String>> obp = new SimpleObjectProperty<ObservableList<String>>();
BooleanProperty hasStuff = new SimpleBooleanProperty();
hasStuff.bind(/* What goes here?? */);
// ObservableProperty has null value
assertFalse(hasStuff.getValue());
obp.set(FXCollections.<String>observableArrayList());
// ObservableProperty is no longer null, but the list has not contents.
assertFalse(hasStuff.getValue());
obp.get().add("Thing");
// List now has something in it, so hasStuff should be true
assertTrue(hasStuff.getValue());
obp.get().clear();
// List is now empty.
assertFalse(hasStuff.getValue());
Я хотел бы использовать строителей в классе Bindings
, а не реализовывать цепочку пользовательских привязок.
Теоретически метод Bindings.select(...)
делает то, что я хочу, за исключением того, что Bindings.selectObservableCollection(...)
нет, а преобразование возвращаемого значения из универсального select(...)
и передача его в Bindings.isEmpty(...)
не работает. То есть результат этого:
hasStuff.bind(Bindings.isEmpty((ObservableList<String>) Bindings.select(obp, "value")));
вызывает ClassCastException
:
java.lang.ClassCastException: com.sun.javafx.binding.SelectBinding$AsObject cannot be cast to javafx.collections.ObservableList
Возможен ли этот вариант использования только с Bindings
API?
Решение
Основываясь на ответе @fabian, вот решение, которое сработало:
ObjectProperty<ObservableList<String>> obp = new SimpleObjectProperty<ObservableList<String>>();
ListProperty<String> lstProp = new SimpleListProperty<>();
lstProp.bind(obp);
BooleanProperty hasStuff = new SimpleBooleanProperty();
hasStuff.bind(not(lstProp.emptyProperty()));
assertFalse(hasStuff.getValue());
obp.set(FXCollections.<String>observableArrayList());
assertFalse(hasStuff.getValue());
obp.get().add("Thing");
assertTrue(hasStuff.getValue());
obp.get().clear();
assertFalse(hasStuff.getValue());