से चयनित आइटम में जावाएफएक्स लेबल को बाध्य करने के लिए मेरे पास POJO से एक सूची दृश्य है और चयनित आइटम से जानकारी प्रदर्शित करने के लिए जीयूआई में एक लेबल चाहते हैं।किसी सूची व्यू
मेरे POJO कि तरह दिखता है:
class Customer {
private String name;
...
public String getName() {
return name;
}
अब जब उपयोगकर्ता सूची मैं चयनित ग्राहकों के एक लेबल में दिखाया गया के नाम चाहते से एक ग्राहक का चयन करता है।
स्पष्ट रूप से मैं name
से सीधे बाध्य नहीं कर सकता क्योंकि यह Property
नहीं है। (और मैं नहीं चाहता कि StringProperty
-objects के साथ अपने ग्राहकों String
रों को बदलने के लिए, क्योंकि SimpleStringProperty
serializable
नहीं है चाहता हूँ और मैं Customer
RMI के माध्यम से स्थानांतरित करने की आवश्यकता है।)
मैं BeanPathAdapter
JFXtras से (जो लग रहा है की कोशिश की है वास्तव में इस तरह जिस तरह से अच्छा):
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(...)
का उपयोग करने से बेहतर समाधान होगा और मैन्युअल रूप से लेबल की आबादी को संभालें।
समस्या का एक हिस्सा पहुँच को प्रतिबंधित कार्यान्वयन है (तरह लग रहा है एडाप्टर इसे संभाल नहीं सकता है)। एक और या तो एक बग या अमान्य उम्मीद हो सकती है (मेरा भी साथ :-) - मान अपडेट केवल बाध्य संपत्ति से दिशा में अनुकूलित छवि (वह पथ है) की दिशा में होता है, न कि दूसरी तरफ। कम से कम यह बीन्स के सबसे सरल के साथ काम नहीं कर सका, न तो एक एफएक्स-गुणों के साथ और न ही एक सादा कोर जावा बीन संपत्ति। – kleopatra