2011-09-28 12 views
12

पर पुन: प्रयोज्य क्रियाओं का उपयोग करके सर्वश्रेष्ठ अभ्यास मैंने अपने स्विंग अनुप्रयोगों में क्रियाओं को पुन: प्रयोज्य बनाने के तरीके पर अलग-अलग चीजों की कोशिश की। मैं भारी वजन, 1000+ लाइन वर्गों (बहुत सारे आंतरिक/एनन कक्षाओं के साथ) पर एक मित्र नहीं हूं और अपने कोड को कई वर्गों में विभाजित करने का प्रयास करता हूं। इस प्रकार उन्हें आसानी से पुन: प्रयोज्य और विनिमय योग्य बनाते हैं।जीयूआई घटक

मैं हर लड़ाई अपने ही वर्गJMenuBar और JToolBar में इसका इस्तेमाल करने के लिए किए गए एक आवेदन पत्र में एक ही क्रिया पुन: उपयोग लिए

। कृपया नीचे दिए गए न्यूनतम उदाहरण पर एक नज़र डालें।

क्या यह एक अच्छा चुनिंदा अभ्यास है (एसएसपी स्थिर आंतरिक कक्षाओं का उपयोग कर)?

public class SomeGUI extends JFrame { 

    public static void main(String[] args) 
    { 
     new SomeGUI(); 
    } 

    public SomeGUI() 
    { 
     setJMenuBar(new MyMenuBar()); 
     add(new MyToolBar()); 

     setSize(400, 400); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

} 

class MyMenuBar extends JMenuBar { 

    JMenu menu = new JMenu("File"); 

    public MyMenuBar() 
    { 
     add(menu); 
     menu.add(new JMenuItem(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N))); 
    } 

} 

class MyToolBar extends JToolBar { 

    public MyToolBar() 
    { 
     add(new Actions.NewAction("New", null, "New File", KeyEvent.VK_N)); 
    } 

} 

class Actions { 

    static class NewAction extends AbstractAction { 
     public NewAction(String name, ImageIcon icon, String desc, Integer mnemonic) 
     { 
      super(name, icon); 
      putValue(SHORT_DESCRIPTION, desc); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent paramActionEvent) 
     { 
      System.out.println("do the new action..."); 
     } 
    } 

} 

आपकी सलाह के लिए तत्पर हैं। अग्रिम में धन्यवाद।

+3

कोड समीक्षा के लिए समर्पित एक स्टैक एक्सचेंज साइट है: http://codereview.stackexchange.com/ – Andrea

+0

अच्छा प्रश्न +1 – mKorbel

उत्तर

2

क्या यह एक अच्छा चुनिंदा अभ्यास है (एसएसपी स्थिर आंतरिक कक्षाओं का उपयोग करके)?

यह आधार स्विंग कोड लागू करने का तरीका है।

उदाहरण के लिए DefaultEditorKit के स्रोत कोड पर नज़र डालें जहां सभी क्रियाएं परिभाषित की गई हैं।

2

एक सुझाव एक समग्र वर्ग का उपयोग नहीं करना होगा जिसमें सभी कार्यवाही हो। बस प्रत्येक वर्ग के लिए एक अलग फ़ाइल का उपयोग करें और इसे सार्वजनिक करें।

किसी अन्य प्रोजेक्ट में कक्षा का उपयोग करने के लिए आपको इस फ़ाइल को प्रतिलिपि बनाने की आवश्यकता होगी, यह मानते हुए कि वर्तमान प्रोजेक्ट में इसकी कोई विशिष्ट निर्भरता नहीं है।

+0

एक समग्र वर्ग मुझे इंटरफेस जैसे स्थिर गुणों को पकड़ने का मौका देता है। इसका उपयोग इंटरफ़ेस से विधियों को कॉल करके क्रियाप्रदर्शित() - विधि को कार्यान्वित करने के लिए किया जा सकता है। तो मुझे एक कार्रवाई के निर्माता के माध्यम से एक संदर्भ पारित करने की जरूरत नहीं है। नुकसान यह है कि मुझे एक बार कुल वर्ग को "प्रारंभ करना" और गुणों को सेट करना होगा। – uriel

+0

यदि आपके पास स्थिर गुण हैं तो उन्हें स्थिर बनाएं और कक्षा संदर्भ के बिना उन्हें एक्सेस करें। – StanislavL

+0

ठीक है, मेरी क्रियाओं/मेनू का एक बड़ा हिस्सा प्रतिबिंब के माध्यम से बनाया जाता है। मेरे पास एक सहायक वर्ग है जिसमें मैं नियंत्रक ऑब्जेक्ट पास करता हूं, और प्रत्येक सार्वजनिक विधि के लिए फ्लाई पर संबंधित कार्रवाई के साथ जेमेनू उत्पन्न होता है। –

1

मैं अक्सर क्या करता हूं (और guts-gui प्रोजेक्ट से GutsAction का उपयोग करते समय यह भी आसान है) कि मैं एक वर्ग में समूह से संबंधित क्रियाएं करता हूं।

मैं एक final public क्षेत्र के रूप में प्रत्येक कार्य की दुकान (लेकिन यदि आप public क्षेत्रों नफरत आप अभी भी उन private बनाने के लिए और प्रत्येक पर एक गेटर विधि dfine सकते हैं)।

प्रत्येक क्रिया को एक छोटे अज्ञात वर्ग के रूप में परिभाषित किया जाता है जहां अंतिम क्षेत्र घोषित किया जाता है।

समूहकरण के लिए मानदंड अनिवार्य रूप से कार्यात्मक हैं लेकिन उनमें कुछ संदर्भ भी शामिल हो सकते हैं, उदा। आपके पास एक कक्षा हो सकती है जिसमें वर्तमान में चयनित ऑर्डर (ऑर्डर JTable) पर किए गए विभिन्न क्रियाएं शामिल हों, इस प्रकार मैं केवल एक वर्ग में संदर्भ (वर्तमान चयनित ऑर्डर) डाल सकता हूं, और मैं सक्षम करने के लिए आवश्यक विधियां भी डाल सकता हूं/चयन में परिवर्तन के दौरान सभी कार्यों को अक्षम करें।

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