2012-09-17 20 views
8


शीर्षक के लिए खेद है, शायद बहुत सामान्य।एक्शनलिस्टर सर्वोत्तम प्रथाओं

मैं पहले से ही How to Write an Action Listener जावा द्वारा ट्यूटोरियल पढ़ता हूं और मैंने पहले से ही this question पढ़ा है, लेकिन मुझे अभी भी कुछ संदेह हैं: मैं सोच रहा था कि मुझे कौन सा समाधान एक ही समय में एक ही क्रिया करना है।

मैं उसी ActionListener का पुन: उपयोग करना चाहता हूं, लेकिन मुझे इस बात पर यकीन नहीं है कि इसे सर्वोत्तम तरीके से कैसे प्राप्त किया जाए (कोड पठनीयता, कोड मैनेटेनिटी, प्रदर्शन और कोड शैली की अवधि में बोलना)।

सबसे पहले "मानक" कोड (जो मैं प्रयोग करेंगे अगर मैं कार्रवाई श्रोता पुन: उपयोग करने नहीं जा रहा हूँ): के बाद से यह एक गुमनाम आंतरिक है,

btnMenu.addActionListener(
    new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      Navigator.showMenu(); 
     } 
    } 
); 

इस तरह से मैं कुछ भी पुन: उपयोग नहीं कर सकते Obv वर्ग ...

अब, मैं निम्नलिखित समाधान के बारे में सोच सकते हैं:

  1. स्टोर एक क्षेत्र में एक बेनामी इनर क्लास के लिए एक संदर्भ (कि सबसे अधिक संभावना static final हो जाएगा);
  2. ActionListener इंटरफ़ेस लागू करने वाली एक नई कक्षा लिखें। समाधान 2 के लिए

    public static final MENU_ACTION_LISTENER = new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         Navigator.showMenu(); 
        } 
    }; 
    
    btnMenu.addActionListener(MENU_ACTION_LISTENER); 
    

    उदाहरण कोड: समाधान 1 के लिए

उदाहरण कोड

  1. कहाँ स्टोर करने के लिए:

    // package-private, only GUI-package classes should be able to use it. 
    // most likely I won't ever need to subclass it, so why not making it final? 
    final class MenuActionListener implements ActionListener { 
        public void actionPerformed(ActionEvent e) { 
         Navigator.showMenu(); 
        } 
    } 
    
    // now, wherever I need to use it: 
    btnMenu.addActionListener(new MenuActionListener()); 
    

    मैं दोनों समाधान के बारे में कुछ संदेह है बेनामी एक्शन श्रोताओं के संदर्भ? मेरे पास एक प्रकार की यूटिलिटी क्लास (उदा। ActionListenersUtil) हो सकती है, जहां सभी एक्शन श्रोताओं को स्टोर किया जाए, मैं static final फ़ील्ड्स में पुन: उपयोग करना चाहता हूं, लेकिन मुझे यह पसंद नहीं है ... ऐसा लगता है कि मुझे खराब डिजाइन लगता है।

  2. यह अधिक भावना, शायद सबसे अच्छा Command Pattern इस प्रकार बनाता है ... मैं शुरू में संकुल के बारे में कुछ संदेह नहीं था ... मैं एक अलग पैकेज में सभी श्रोताओं (जीयूआई तत्वों के लिए com.myapp.gui और के लिए com.myapp.gui.listeners जैसे करना चाहते हैं श्रोताओं। लेकिन जब मैंने इसे लिखा तो मुझे एहसास हुआ कि मेरे पास कोई विकल्प नहीं है: एकमात्र जगह जहां यह समझ में आता है उसी पैकेज में है (क्योंकि वे पैकेज-निजी होना चाहिए), भले ही आदेश के लिए मेरे पास होगा उन्हें सभी को एक अलग पैकेज में रखना पसंद है। मुझे अभी भी कुछ संदेह है, क्योंकि जीयूआई के मामले में अधिकांश एक्शन श्रोताओं को पुन: प्रयोज्य भी किया जा सकता है; फिर भी यह एक ही पैकेज में रखना अच्छा विचार होगा?

एक और सवाल: क्या btnMenu.addActionListener(MENU_ACTION_LISTENER); और btnMenu.addActionListener(new MenuActionListener()); बुला के बीच का अंतर (JVM, वर्ग लोड हो रहा है, वर्ग संकलन, स्मृति की अवधि प्रत्येक वर्ग, कचरा संग्रहण और इतने पर के कब्जे में बोल) है?

कृपया मदद करें, मैं अभी इतनी उलझन में हूं! :(

उत्तर

14

ActionListener के बजाय Action बनाने का सबसे अच्छा तरीका है यदि आपको इसे बटन, मेनू, ... से जोड़ना है।एक Action एक JButton का मॉडल है, और मॉडल साझा करने के लिए

मतलब है

यह भी आप पाठ, आइकन को बदलने की क्षमता, सक्षम स्थिति, और सभी बटन कि Action से जुड़ा हुआ है की अन्य संपत्तियों देता है बिना किसी कॉल के एक ही समय में। इसके अलावा, इसे मेनू आइटम और साथ ही साथ जोड़ा जा सकता है।

Action बनाने के लिए आपको स्क्रैच से प्रारंभ करने की आवश्यकता नहीं है। AbstractAction एक अच्छा प्रारंभिक बिंदु है। Swing Action tutorial भी एक अच्छा पढ़ा है।

+3

+1 यह आपको टेक्स्ट, आइकन, सक्षम स्थिति और उन सभी बटनों के अन्य गुणों को बदलने की क्षमता देता है जो 'एक्शन' एक ही समय में एकाधिक कॉल के बिना संलग्न होते हैं। इसके अलावा, इसे मेनू आइटम और साथ ही साथ जोड़ा जा सकता है। – Brian

+1

+1000 अगर मैं कर सकता था ... ;-) –

+0

@ ब्रायन बहुत अच्छी टिप्पणी। मैंने इसे अधिक पूर्ण बनाने के उत्तर में इसे कॉपी किया है – Robin

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