2014-04-28 3 views
13

मैं java8 में lambda के साथ एक नया ListChangeListener() कैसे लिखूं?मैं लैम्ब्डा के साथ एक नया ListChangeListener <Item>() कैसे लिखूं?

listItems.addListener(new ListChangeListener<Item>() { 
    @Override 
    public void onChanged(
     javafx.collections.ListChangeListener.Change<? extends Item> c) { 
     // TODO Auto-generated method stub 
    } 
}); 

यह है कि मैं क्या करने की कोशिश की है:

listItems.addListener(c->{}); 

लेकिन ग्रहण कहता है:

विधि addListener (ListChangeListener) प्रकार ObservableList के लिए अस्पष्ट है। के रूप में

सूची घोषित किया जाता है:

ObservableList<Item> listItems = FXCollections.observableArrayList(); 

उत्तर

24

ObservableList के बाद से Observable इंटरफ़ेस से addListener(InvalidationListener) इनहेरिट करती है, संकलक निर्धारित करने के लिए कौन-सा संस्करण कॉल करने में असमर्थ है। एक कलाकार के माध्यम से लैम्ब्डा के प्रकार को निर्दिष्ट करना इसे ठीक करना चाहिए। प्रकार निर्दिष्ट किए बिना ही

listItems.addListener((ListChangeListener.Change<? extends Item> c) -> {/* ... */}); 
+8

'searchResultListItems.addListener ((ListChangeListener.Change ग) -> {});' संकेत – simonides

+0

एक मुश्किल से एक था कि के लिए चाल THX किया था। –

+0

चेंजलिस्टर के साथ उपर्युक्त विकल्प नहीं कर सकता। PropertyListeners का उपयोग ... "Lambda अभिव्यक्ति का हस्ताक्षर कार्यात्मक इंटरफ़ेस विधि के हस्ताक्षर से मेल नहीं खाता (ObservableValue, ऑब्जेक्ट, ऑब्जेक्ट)"। - जब कोशिश कर रहा है: property.addListener ((ChangeListener) e -> ({/ * ... * /})); – Lealo

3

इस कोड काम करता है:

listItems.addListener((ListChangeListener)(c -> {/* ... */})); 

तुम भी स्पष्ट रूप से c के प्रकार निर्दिष्ट कर सकते हैं।

listView.focusedProperty().addListener ((arg, oldVal, newVal) -> System.out 
     .printf ("ListView %s focus%n", (newVal ? "in" : "out of"))); 
+0

आपका समाधान ListViews के लिए काम करता है, लेकिन सवाल ObservableLists के बारे में था, जिसमें फोकसप्रॉपर्टी नहीं है। – ktul

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