2013-09-04 7 views
6

से चयनित आइटम में जावाएफएक्स लेबल को बाध्य करने के लिए मेरे पास POJO से एक सूची दृश्य है और चयनित आइटम से जानकारी प्रदर्शित करने के लिए जीयूआई में एक लेबल चाहते हैं।किसी सूची व्यू

मेरे POJO कि तरह दिखता है:

class Customer { 
    private String name; 
    ... 
    public String getName() { 
    return name; 
    } 

अब जब उपयोगकर्ता सूची मैं चयनित ग्राहकों के एक लेबल में दिखाया गया के नाम चाहते से एक ग्राहक का चयन करता है।

स्पष्ट रूप से मैं name से सीधे बाध्य नहीं कर सकता क्योंकि यह Property नहीं है। (और मैं नहीं चाहता कि StringProperty -objects के साथ अपने ग्राहकों String रों को बदलने के लिए, क्योंकि SimpleStringPropertyserializable नहीं है चाहता हूँ और मैं Customer RMI के माध्यम से स्थानांतरित करने की आवश्यकता है।)

मैं BeanPathAdapterJFXtras से (जो लग रहा है की कोशिश की है वास्तव में इस तरह जिस तरह से अच्छा):

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(...) का उपयोग करने से बेहतर समाधान होगा और मैन्युअल रूप से लेबल की आबादी को संभालें।

+0

समस्या का एक हिस्सा पहुँच को प्रतिबंधित कार्यान्वयन है (तरह लग रहा है एडाप्टर इसे संभाल नहीं सकता है)। एक और या तो एक बग या अमान्य उम्मीद हो सकती है (मेरा भी साथ :-) - मान अपडेट केवल बाध्य संपत्ति से दिशा में अनुकूलित छवि (वह पथ है) की दिशा में होता है, न कि दूसरी तरफ। कम से कम यह बीन्स के सबसे सरल के साथ काम नहीं कर सका, न तो एक एफएक्स-गुणों के साथ और न ही एक सादा कोर जावा बीन संपत्ति। – kleopatra

उत्तर

2

एक बेहतर समाधान जो मुझे लगता है, मैंने पहले दिया था, जैसा कि आपने कोशिश की थी, बीनपाथ एडाप्टर का उपयोग करना है।

private final ObjectProperty<B> beanProp = new SimpleObjectProperty<>(); 
{ 
    beanProp.addListener(new ChangeListener<B>() 
    { 
     @Override 
     public void changed(ObservableValue<? extends B> ob, B oldVal, B newVal) 
     { 
      setBean(newVal); 
     } 
    }); 
} 

public ObjectProperty<B> beanProperty() 
{ 
    return beanProp; 
} 

फिर अपने कोड में आप निम्नलिखित की जरूरत है::
हालांकि BeanPathAdapter निम्नलिखित संपत्ति से जोड़ रहे है की जरूरत है

BeanPathAdapter<Customer> custBean; 
custBean = new BeanPathAdapter<>(new Customer()); // empty or any customer 
custBean.bindBidirectional("name", label.textProperty()); 
custBean.beanProperty().bind(listview.getSelectionModel().selectedItemProperty()); 
+0

यह बहुत आशाजनक लग रहा है। मैं इसे आज आज़मा दूंगा। धन्यवाद! (बीटीडब्ल्यू। देर से उत्तर के लिए खेद है!) –

+0

एक आकर्षण की तरह काम करता है! धन्यवाद!! –

1

मुझे नहीं लगता कि एक साधारण एक लाइनर है जिसे आप ढूंढ रहे हैं।

label.textProperty().bind(Bindings.selectString(listview.getSelectionModel().selectedItemProperty(), "name")); 

लेकिन तुम तो की तरह अपने ग्राहक POJO को संशोधित करने की आवश्यकता होगी::
आप निम्न कर सकता है, क्योंकि गुण परिवर्तनों को प्रतिबिंबित करने की उम्मीद कर रहे

class Customer 
{ 
    private String name; 
    ... 
    public String getName() { return name; } 

    public ReadOnlyStringProperty nameProperty() 
    { 
     return new SimpleStringProperty(name); 
    } 
} 

मैं यह नहीं लगता कि सिफारिश की है अंतर्निहित डेटा में और उपर्युक्त केवल उस नाम को प्रतिबिंबित करेगा जैसा कि नामप्रोपर्टी कहलाता था। तो यदि सेटनाम को संपत्ति कहा जाता है तो परिवर्तन को प्रतिबिंबित नहीं करेगा। यदि ग्राहक का नाम कभी नहीं बदलता है तो आप इससे दूर हो सकते हैं।

संबंधित मुद्दे