Tôi có một ListView đầy POJO và muốn có nhãn trong GUI để hiển thị thông tin từ mục đã chọn.Cách liên kết Nhãn JavaFX với mục đã chọn từ một ListView
My POJO trông giống như thế:
class Customer {
private String name;
...
public String getName() {
return name;
}
Bây giờ khi người sử dụng chọn một khách hàng từ danh sách Tôi muốn tên của khách hàng chọn được hiển thị trong một nhãn.
Rõ ràng là tôi không thể liên kết trực tiếp với số name
vì nó không phải là Property
. (Và tôi không muốn thay thế khách hàng của tôi String
s với StringProperty
-objects vì SimpleStringProperty
không phải là serializable
và tôi cần Customer
để được chuyển qua RMI.)
Tôi đã thử các BeanPathAdapter
từ JFXtras (trông thật sự tốt đẹp bằng cách này) như thế này:
BeanPathAdapter<MultipleSelectionModel> customerBeanPathAdapter;
customerBeanPathAdapter = new BeanPathAdapter<>(lstCustomers.getSelectionModel());
customerBeanPathAdapter.bindBidirectional("selectedItem.name", lblCustomerName.textProperty());
Nhưng giải pháp này chỉ ném cho tôi một ngoại lệ:
...
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
Vì vậy, tôi hy vọng sẽ có một giải pháp tốt hơn so với sử dụng lstCustomers.getSelectionModel().selectedItemProperty().addListener(...)
và xử lý dân số của nhãn ở đó theo cách thủ công.
Một phần của vấn đề là khả năng tiếp cận hạn chế thực hiện (trông giống như bộ điều hợp không thể xử lý nó). Khác có thể là lỗi hoặc kỳ vọng không hợp lệ (của tôi cũng như :-) - cập nhật giá trị dường như chỉ xảy ra theo hướng từ thuộc tính bị ràng buộc trở lại thuộc tính được điều chỉnh (đó là đường dẫn), chứ không phải theo cách khác. Ít nhất không thể làm cho nó hoạt động với các hạt đơn giản nhất, không phải với một thuộc tính fx hay một thuộc tính bean java thuần túy. – kleopatra