2012-07-11 7 views
16

की ऑब्जेक्ट का उपयोग करना चाहिए java.awt.event.ActionListener इंटरफ़ेस को कार्यान्वित करने का सबसे अच्छा तरीका क्या है?क्या आपकी कक्षा एक्शनलिस्टर को कार्यान्वित कर सकती है या किसी अज्ञात एक्शनलिस्टर वर्ग

class Foo implements ActionListener{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(this); 
    } 

    public void actionPerformed(ActionEvent e) { 

    } 
} 

या एक गुमनाम ActionListener वर्ग की एक वस्तु जोड़ें::

class Foo{ 

    public Foo() { 
     JButton button = new JButton(); 
     button.addActionListener(new ActionListener() {  
      public void actionPerformed(ActionEvent e) { 

      } 
     }); 
    } 
} 

उत्तर

30

कुछ (जेनेट/Kleopatra) लगभग कहना

अपनी कक्षा ActionListener को लागू करने और एक ActionListener के रूप में जोड़ना है कभी भी एक्शनलिस्टर का उपयोग न करें, और इसके बजाय क्रियाओं जैसे क्रियाओं का उपयोग करें। यह आपके जीयूआई वर्ग को आपके श्रोताओं को लागू करने के लिए लगभग हमेशा एक बुरा आदर्श है, हालांकि यह Single Responsibility Principle को तोड़ता है और आपके कोड को बनाए रखने और विस्तारित करने में अधिक कठिन बनाता है, और इसलिए मैं दृढ़ता से आग्रह करता हूं कि आप ऐसा न करें।

इसलिए उदाहरण के लिए

, इस के लिए एक आंतरिक वर्ग:

import java.awt.event.ActionEvent; 
import java.awt.event.KeyEvent; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 

class Foo { 

    public Foo() { 
     JButton button = new JButton(new ButtonAction("Action", KeyEvent.VK_A)); 
    } 

    private class ButtonAction extends AbstractAction { 
     public ButtonAction(String name, Integer mnemonic) { 
     super(name); 
     putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
     System.out.println("button pressed"); 
     } 
    } 

} 
+0

+1 - सार तत्व –

+0

+1 'सार तत्व' और ['एकल उत्तरदायित्व सिद्धांत 'के लिए +1 (http://en.wikipedia.org/wiki/Single_responsibility_principle)। –

+1

अच्छा, लेकिन यह अधिक जटिल (कोड बनाए रखने वाले कोड में) लगता है, और पढ़ने के लिए और अधिक कठिन है। या मैं गलत हूँ? – elias

4

यह निर्भर करता है। यदि आप कई घटकों में ActionListener का पुन: उपयोग करना चाहते हैं, तो विकल्प एक बेहतर है। यदि ActionListener केवल एक बटन से जुड़ा होगा, तो विकल्प दो ठीक है।

आम तौर पर, यदि आप परियोजना में कुछ वृद्धि की उम्मीद करते हैं, तो आप एक अलग वर्ग (या आंतरिक वर्ग) बनायेंगे। ActionListener को लागू करने के लिए Foo की आवश्यकता नहीं है।

+2

दृश्य में आंतरिक कक्षा में वापस चला गया। एक गुई क्लास लागू करने के बाद एक्शनलिस्टर केवल खिलौनों के कार्यक्रमों के लिए है। चूंकि वह "सर्वोत्तम प्रथाओं" के बारे में पूछ रहा है, इसलिए किसी भी परिस्थिति में इसका कोई उपयोग नहीं है। –

8

दूसरा विकल्प (अनाम वर्ग) निश्चित रूप से बेहतर है, दूसरा विकल्प Foo के भीतर एक नेस्टेड क्लास होना होगा।

मैं दो कारणों के लिए पहला विकल्प के साथ जाना नहीं होगा:

  • Foo के उपयोगकर्ताओं को पता है कि यह लागू करता ActionListener नहीं होना चाहिए।
  • आप एक ही कक्षा में दो अलग श्रोताओं को लागू नहीं कर सकते हैं।
+0

मैं इस कारण को पहले कारण के लिए उखाड़ फेंक दूंगा, लेकिन दूसरा कारण सिर्फ गलत इमो है। आप 'एक्शनवेन्ट' के स्रोत की जांच कर सकते हैं और आपको जो कोड पथ लेना चाहिए उसे तय कर सकते हैं।चाहे वह एक सुरुचिपूर्ण समाधान है, एक और चर्चा है, लेकिन यह निश्चित रूप से संभव है – Robin

+4

@ रोबिन: आप सही हैं लेकिन यह मेरा मुद्दा नहीं था। मेरा मतलब यह था कि कोई भी उसी वर्ग में 'एक्शनलिस्टर' को दो बार लागू नहीं कर पाएगा। – casablanca

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