Java FX プロパティは、開発者が標準の get/set メソッド セマンティクスを使用する代わりにプロパティを作成できるようにする優れた API です。また、変更へのサブスクリプション、基本的な型とコレクションのプロパティ式のサポートも追加します。C# には言語の一部としてプロパティがありますが、これらのプロパティは JavaFX コンテナー内でのみ使用できます。つまり、変更をリッスンしようとIllegalStateException
すると、メインの JavaFX スレッド内でリスナー コードを実行する必要があるということわざに出くわします。
それでは、残りの Java の世界で利用できる代替手段はありますか?
アップデート
の例を次に示しIllegalStateException
ます。JavaFX API を誤用していませんか?
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("s1");
list.add("s2");
ObservableList<String> observableList = FXCollections.observableList(list);
observableList.addListener(new ListChangeListener<String>() {
@Override
public void onChanged(Change<? extends String> change) {
System.out.println("added: " + change.getAddedSubList());
}
});
observableList.add("s3");
}
}
例外:
Exception in thread "main" java.lang.IllegalStateException
at com.sun.javafx.collections.NonIterableChange.checkState(NonIterableChange.java:101)
at com.sun.javafx.collections.NonIterableChange.getPermutation(NonIterableChange.java:81)
at javafx.collections.ListChangeListener$Change.wasPermutated(ListChangeListener.java:156)
at javafx.collections.ListChangeListener$Change.getAddedSubList(ListChangeListener.java:212)
at Test$1.onChanged(Test.java:23)
at com.sun.javafx.collections.ListListenerHelper$SingleChange.fireValueChangedEvent(ListListenerHelper.java:134)
at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:48)
at com.sun.javafx.collections.ObservableListWrapper.callObservers(ObservableListWrapper.java:97)
at com.sun.javafx.collections.ObservableListWrapper.add(ObservableListWrapper.java:154)
at com.sun.javafx.collections.ObservableListWrapper.add(ObservableListWrapper.java:144)
at Test.main(Test.java:27)