ListView에 POJO가 가득 찼으며 GUI의 레이블에 선택한 항목의 정보가 표시되기를 원합니다.ListView에서 선택한 항목에 JavaFX Label을 바인딩하는 방법
내 POJO는 다음과 같은 : 사용자가 내가 레이블에 표시 선택한 고객의 이름을 원하는 목록에서 고객을 선택 이제
class Customer {
private String name;
...
public String getName() {
return name;
}
.
이 아니기 때문에 분명히 name
에 바인딩 할 수 없습니다. (그리고 SimpleStringProperty
이 serializable
하지 않기 때문에 나는 StringProperty
-objects 내 고객 String
의를 교체하지 않고 나는 Customer
가 RMI를 통해 옮겨진 될 필요가있다.) 나는 어떤 보이는 JFXtras에서 BeanPathAdapter
(시도했습니다
이 같은) 그런데 정말 좋은 :
BeanPathAdapter<MultipleSelectionModel> customerBeanPathAdapter;
customerBeanPathAdapter = new BeanPathAdapter<>(lstCustomers.getSelectionModel());
customerBeanPathAdapter.bindBidirectional("selectedItem.name", lblCustomerName.textProperty());
그러나이 솔루션은 나에게 예외가 발생합니다 :
...
Caused by: java.lang.IllegalArgumentException: Unable to resolve accessor getSelectedItem
at jfxtras.labs.scene.control.BeanPathAdapter$FieldHandle.buildAccessor(BeanPathAdapter.java:3062)
at jfxtras.labs.scene.control.BeanPathAdapter$FieldHandle.buildAccessorWithLikelyPrefixes(BeanPathAdapter.java:3022)
at jfxtras.labs.scene.control.BeanPathAdapter$FieldHandle.updateMethodHandles(BeanPathAdapter.java:2986)
at jfxtras.labs.scene.control.BeanPathAdapter$FieldHandle.<init>(BeanPathAdapter.java:2977)
at jfxtras.labs.scene.control.BeanPathAdapter$FieldBean.performOperation(BeanPathAdapter.java:1348)
at jfxtras.labs.scene.control.BeanPathAdapter$FieldBean.performOperation(BeanPathAdapter.java:1186)
at jfxtras.labs.scene.control.BeanPathAdapter.bindBidirectional(BeanPathAdapter.java:567)
at jfxtras.labs.scene.control.BeanPathAdapter.bindBidirectional(BeanPathAdapter.java:369)
at at.gs1.sync.qm.client.gui.MainWindowController.initialize(MainWindowController.java:61)
... 22 more
Caused by: java.lang.IllegalAccessException: symbolic reference class is not public: class javafx.scene.control.ListView$ListViewBitSetSelectionModel, from jfxtras.labs.scene.control.BeanPathAdapter$FieldHandle
at java.lang.invoke.MemberName.makeAccessException(MemberName.java:512)
at java.lang.invoke.MethodHandles$Lookup.checkSymbolicClass(MethodHandles.java:1113)
at java.lang.invoke.MethodHandles$Lookup.resolveOrFail(MethodHandles.java:1094)
at java.lang.invoke.MethodHandles$Lookup.findVirtual(MethodHandles.java:626)
at jfxtras.labs.scene.control.BeanPathAdapter$FieldHandle.buildAccessor(BeanPathAdapter.java:3049)
... 30 more
을 그래서 lstCustomers.getSelectionModel().selectedItemProperty().addListener(...)
을 사용하고 수동으로 레이블의 수를 처리하는 것보다 더 나은 솔루션이 있기를 바랐습니다.
파트 액세스 제한 구현합니다 (처럼 보이는 어댑터가 처리 할 수 없음). 다른 하나는 버그이거나 잘못된 기대 일 수 있습니다. (물론 광산도 있습니다 :-) - 값 업데이트는 바인딩 된 속성에서 다시 적응 된 속성 (즉, 경로)으로 향하는 방향으로 만 발생하는 것으로 보입니다. 적어도 bean의 가장 단순한 것, fx-property 나 평범한 핵심 자바 빈 속성을 가진 것은 아니었다. – kleopatra