2012-10-05 19 views
5

में जेनरिक को संभालने के लिए मेरे पास है:जावा स्विंग - कैसे ActionListener

class CustomerActionListener implements ActionListener 
{ 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    JComboBox cb = (JComboBox)event.getSource(); 
    .. do something 
    } 
} 

कौन सा jdk7 में निम्नलिखित संकलक चेतावनी का कारण बनता है:

JComboBox एक कच्चे प्रकार है। सामान्य प्रकार JComboBox के सन्दर्भ पैरामिट्रीकृत होना चाहिए

मुझे लगता है कि इस तरह के लिए यह parameterize करने की कोशिश की है:

JComboBox<String> cb = (JComboBox<String>)event.getSource(); 

लेकिन यह अभी भी निम्न संकलक चेतावनी छोड़ देता है:

प्रकार की सुरक्षा: अनियंत्रित डाली ऑब्जेक्ट से JComboBox

इसलिए मुझे यकीन नहीं है कि कंपाइलर चेतावनियों को कैसे खत्म किया जाए ...

+0

क्या कोई उदाहरण चेक मदद करता है? यहां तक ​​कि यदि आप जानते हैं कि आप हमेशा अंत में एक JComboBox प्राप्त करने जा रहे हैं। – Rex

+0

मुझे नहीं लगता कि आप समस्या को हल करने के लिए "कोड" समाधान का समाधान करते हैं। आप चेतावनियों को दबा सकते हैं, कितनी बार। Http://stackoverflow.com/questions/593996/how-to-suppress-java-compiler-warnings-for- विशिष्ट- कार्यों पर एक नज़र डालें। समस्या यह है कि संकलक 'ActionEvent.getSource' को देखता है और कहता है "मेरे पास एक ऑब्जेक्ट है और सिद्धांत रूप में, आप मुझे कास्ट कर सकते हैं, जो आप मुझे काम करने के लिए नहीं डाल सकते हैं" – MadProgrammer

+0

मैं समझता हूं कि आप दबाने में सक्षम हो सकते हैं चेतावनी, लेकिन यह मेरे लिए आदर्श से कम है। अगर मैंने इसे सभी कंपाइलर चेतावनियों के साथ किया है, तो चलो बस कहना है कि यह अच्छा नहीं होगा। यदि संभव हो तो यह पता लगाना हमेशा बेहतर होता है कि क्यों और सही ढंग से इसे हल करें। –

उत्तर

4

मैं इस दृष्टिकोण की प्रशंसा करता हूं। यह किसी भी टाइपकास्ट से बचाता है और पढ़ने में आसान है।

मैंने अपना जवाब सुधार लिया, अब यह आपको कंपाइलर चेतावनी नहीं देता है। JComboBox का प्रकार अब स्ट्रिंग पर सेट है। चयनित आइटम प्राप्त करने के लिए, आपको कॉम्बोबॉक्स मॉडल से गुज़रना होगा। इस

JComboBox<String> myStringCb = new JComboBox<String>(); 
... 
myStringCb.addActionListener(new CustomerActionListener(myStringCb); 

तरह

या तो और आप ActionListener साथ:

class CustomerActionListener implements ActionListener 
{ 
    private JComboBox<String> comboBox; 
    public CustomerActionListener(JComboBox<String> comboBox){ 
    this.comboBox = comboBox; 
    } 
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
    // Just use the comboBox 
    ComboBoxModel<String> model = comboBox.getModel(); 
    int index = comboBox.getSelectedIndex(); 
    String choosen = model.getElementAt(index); 
    System.out.println("Hey you choose "+choosen); 
    } 
} 
+1

और यह * JComboBox से छुटकारा पाने में कैसे मदद करेगा कच्चे प्रकार का है। सामान्य प्रकार JComboBox के संदर्भ पैरामीटर * चेतावनी होना चाहिए। आपके कोड में एक ही समस्या है – Robin

+1

जेडीके 7 के साथ उस कोड को संकलित करने का प्रयास करें -> आपके पास अभी भी कंपाइलर चेतावनी है! आपका जवाब समस्या को हल नहीं करता है क्योंकि यह खड़ा है। –

+0

धन्यवाद रॉबिन और गिलाउम। कुछ बदलाव किए सबसे पहले मैं JComboBox पर प्रकार सेट करना भूल गया। इसके बाद मैंने सोचा कि एक टाइप किया गया JComboBox बस टाइप किए गए परिणाम को आसानी से getSelectedItem() को कॉल करके टाइप किया जा सकता है। लेकिन यह नहीं कर सकता। अब यह ठीक काम करना चाहिए। मुझे कोई कंपाइलरवार्निंग नहीं मिल रही है। – daniel

0

कोशिश यह जाँच करने के लिए:

A very useful link form StackOverflow

कुछ शब्दों में, जावा नहीं पता है कि वस्तु एक कास्ट किए जाने की कोशिश कर रहे है, इसलिए इसे डाली करने के लिए पसंद नहीं है बिना किसी शब्द के, आपको यह सलाह देनी चाहिए कि आप शायद गलती कर रहे हैं (लेकिन आप जानते हैं कि किस प्रकार का वर्ग आप ऑब्जेक्ट कर रहे हैं, इसलिए इसके बारे में कोई फर्क नहीं पड़ता) एक @SuppressWarning ("अनचेक")

जोड़ें
+0

@stephane (मेरिटॉन द्वारा लिखित)। तो आपको दबाने की चेतावनी जोड़ने की आवश्यकता नहीं है;) आप लिख सकते हैं: कक्षा > सी = क्लाइंटएक्शन.क्लास बढ़ाता है; एक्शन <क्लाइंटइंटरफेस> एक्शन = सी। न्यू इंस्टेंस(); यह गैर-जेनेरिक प्रकार को शुरू करने की कीमत पर कलाकार और चेतावनी दोनों को समाप्त करता है ताकि आप पर्याप्त सटीक टाइप किए गए क्लास ऑब्जेक्ट को प्राप्त करने के लिए .class का उपयोग कर सकें। – Gianmarco

0

केवल यहाँ बाहर तरीका है अपने JComboBox करने के लिए एक टाइप किया संदर्भ हड़पने के लिए है

class CustomerActionListener implements ActionListener { 

    private JComboBox<String> cb; 

    public CustomerActionListener(JComboBox<String> cb) { 
    this.cb = cb; 
    } 

    @Override 
    public void actionPerformed(ActionEvent event) { 
    if(event.getSource()==cb) { 
     // Here you can do something with the typed cb 
    } 
    } 
} 

या, एक और समाधानके साथ एक अज्ञात ActionListener का उपयोग करना हैसंदर्भ:

final JComboBox<String> myStringCb = new JComboBox<String>(); 
myStringCb.addActionListener(new ActionListener(){ 

    public void actionPerformed(ActionEvent e) { 
     // Here you can refer directly to myStringCb 
    } 

}); 
+0

एह ... यह एक एक्शन के बुनियादी विचार के लिए काफी विरोधाभासी है (जो एक से कई है :-) – kleopatra

+0

@ क्लेओपेट्रा कुछ भी आपको इसे एक से अधिक करने से रोकता है। इस उदाहरण में, मैंने मूल अवधारणा और एक-से-एक संबंध का खुलासा किया। लेकिन जैसा कि आपने किसी अन्य पोस्ट में इंगित किया है, यूआई तत्व का टाइपिंग व्यर्थ है। यह मॉडल से आगे नहीं जाना चाहिए। –

+1

_ कुछ भी आपको इसे एक-से-कई बनाने से रोकता है। कुछ भी नहीं ... लक्ष्य की एक सूची रखते हुए? मुझे नहीं लगता कि यह एक व्यवहार्य विकल्प है, अंत में हम कम से कम इस दृष्टिकोण में जेनेरिक की उदासीनता पर सहमत हैं :-) – kleopatra

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