2009-12-12 10 views
5

मैं आंतरिक कक्षाओं के साथ मानक अभ्यास के बारे में सोच रहा हूं (जावा में लेकिन मुझे लगता है कि यह सभी ओओ भाषाओं पर लागू होता है)। तो मेरे पास एक जेएफआरएएम सबक्लास ControllerWindow है जिसमें एक जेपीनल सबक्लास MapPanel है जिसे मैं आकर्षित करता हूं (इसलिए इसे पेंटकंपोनेंट विधि को ओवरराइट करने की आवश्यकता है) और जिसे माउस श्रोता को कार्यान्वित करने की आवश्यकता होती है। मेरा वर्तमान समाधान जो काम करता है MapPanel को एक अलग वर्ग में माउसलिस्टर लागू करने के लिए है, लेकिन जब मैंने इसे उस व्यक्ति को दिखाया जो मेरा कोर्स चलाता है तो दूसरे दिन वह सोचता था (हमारे पास भाषा बाधा है) यह एक आंतरिक में होना चाहिए ControllerWindow में कक्षा या कम से कम माउस लिस्टर एक आंतरिक वर्ग होना चाहिए।जीयूआई के लिए आंतरिक कक्षाओं का उपयोग करने के लिए मानक?

तो मेरा सवाल यह है कि यहां एक मानक समाधान होगा, माउस क्लाइस्टर को आंतरिक कक्षा में, जेपीनेल को एक अलग आंतरिक कक्षा में या फिर भी अपनी अलग कक्षा में डालने के लिए? जेपीनेल एक आंतरिक वर्ग में माउसलिस्टर को कार्यान्वित कर रहा है? और क्यों?

मेरे लिए सबसे महत्वपूर्ण बात यह है कि यह काम करता है लेकिन यदि संभव हो तो मैं इन चीजों के पीछे मानक प्रथाओं के बारे में जानना और समझना चाहता हूं।

संपादित करें: नीचे दिए गए वर्तमान कोड का बहुत सरल संस्करण।

class ControllerWindow extends JFrame{ 
    ... 
    MapPanel drawPanel = new MapPanel(); 
    ... 
} 

और एक अलग वर्ग:

class MapPanel extends JPanel implements MouseListener{ 

    ... 

    public void paintComponent(Graphics g){ 
     ...//fillRects etc. 
    } 

    //MouseListener methods 
    public void mouseReleased(MouseEvent e){ 
     requestFocus(); 
     ... 
     repaint() 
     ... 
    } 
    public void mousePressed(MouseEvent e){} 
    public void mouseEntered(MouseEvent e){} 
    public void mouseExited(MouseEvent e){} 
    public void mouseClicked(MouseEvent e){} 
} 

इसके अलावा इस एक स्थिति जहां यह एक ही फाइल में दोनों वर्गों डाल करने के लिए स्वीकार्य होगा हो सकता है? मैं ControllerWindow के अलावा किसी अन्य चीज़ के लिए MapPanel का उपयोग करने की परिकल्पना नहीं करता हूं।

+2

जीयूआई कोड के लिए मानक अभ्यास मिट्टी की एक बड़ी गेंद है। –

+0

क्या आप कुछ कोड प्रदान कर सकते हैं? यदि आवश्यक हो तो सरलीकृत। – amorfis

उत्तर

4

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

उदाहरण के लिए, यदि आप नियंत्रक विन्डो में एक आंतरिक वर्ग के रूप में MapPanel को एम्बेड करते हैं, और उसके बाद बाद में इसे एक अलग प्रकार के MapPanel के साथ बदलना चाहते हैं, तो आपको अलग-अलग के लिए MapPanel को स्वैप करने के बजाए नियंत्रक विन्डो को भारी अपडेट मिला है घटक प्रकार

माउसलिस्टर के साथ, मैं इसे मैपपैनल में शामिल करने के इच्छुक हूं यदि यह विशेष रूप से उस घटक के लिए ईवेंट को संभालने में सक्षम है (यानी, यदि केवल नक्शापैन "जानता है" क्या क्लिक का मतलब है, तो यह प्रक्रिया करने वाला एक होना चाहिए क्लिक करें)। मैं निश्चित रूप से इसे नियंत्रक विन्डो में नहीं डालूंगा, तब से आप MapPanel से कार्यान्वयन विवरण "लीक" कर रहे हैं।(एकमात्र मामला मैं सोच सकता हूं: आपके MapPanel के अतिरिक्त, आपके पास कई पैनल प्रकार हैं जिन्हें सभी को उसी तरह से क्लिक करने की आवश्यकता होती है, इसलिए प्रत्येक पैनल में कार्यान्वित करने के बजाय आप नियंत्रक विन्डो कर सकते हैं। लेकिन फिर भी , मुझे यकीन नहीं है कि कोड नियंत्रक विन्डो में होना चाहिए)।

क्या MapPanel का माउस श्रोता माउसलिस्टर का आंतरिक वर्ग कार्यान्वयन है, या क्या MapPanel इसे लागू करता है (जैसा कि उपरोक्त आपके कोड में है) शायद आप जिस शैली को पसंद करते हैं उसके प्रश्न पर आते हैं।

7

घटना सुनने वालों के रूप में अज्ञात आंतरिक कक्षाओं का उपयोग करना आम है क्योंकि कोड आमतौर पर काफी सरल होता है (इसलिए एक अलग वर्ग अधिक हो सकता है) और हैंडलर कोड को उस कोड पर "करीबी" रखने के लिए जो श्रोता को पंजीकृत करता है, पठनीयता में सुधार कर सकता है लोग आपके कोड को समझने की कोशिश कर रहे हैं, क्योंकि घटना से संबंधित सभी कोड एक ही स्थान पर हैं।

संपादित करें: यह विशेष रूप से कक्षाओं के लिए सच है जो केवल एक श्रोता विधि को लागू करते हैं। माउसलिस्टर जैसे मल्टी-विधि इंटरफेस के लिए शायद कम सच है, क्योंकि पूर्ण इंटरफ़ेस लागू करने वाली कक्षा अधिक वर्बोज़ होगी।

+2

'माउसलिस्टर' जैसे इंटरफ़ेस के लिए 'माउसएडाप्टर' जैसी कक्षाएं हैं जो आपको केवल उन तरीकों को ओवरराइड करने देती हैं जिनकी आप वास्तव में परवाह करते हैं। – Bombe

+1

यूप, और यह एक अज्ञात भीतरी कक्षा के रूप में भी किया जा सकता है। सब जीतता है। –

0

एकाधिक ईवेंट हैंडलिंग आवश्यकता के कारण अज्ञात आंतरिक कक्षाएं आवश्यक हैं। अज्ञात वर्ग को तर्क में, किसी विधि में, कक्षा में कहीं भी लिखा जा सकता है। इसलिए प्रत्येक श्रोता के लिए कई कक्षाएं बनाने से बचने के लिए अनाम को प्राथमिकता दी जाती है।

1

आंतरिक वर्ग बेहतर होगा यदि इसका सरल वाक्यविन्यास हो।

button1.click(function(event){ do something x... }); 
button2.click(function(event){ do something y... }); 
radio2.check (function(event){ do something z... }); 

जावा 7 हमें ऐसा कुछ दे सकता है और पूरी स्थिति बदल सकता है। जैसा कि अब है, बहुत सारे बेनामी आंतरिक वर्गों का उपयोग करके कोड को गड़बड़ कर सकते हैं और इसे पढ़ना असंभव हो सकता है। आपको अपनी शैली को सुंदर और सुगम बनाने वाली शैली चुननी चाहिए।

0

मैं इस लेख उपयोगी पाया: http://www.retrologic.com/innerclasses.doc3.html

सामान्य तौर पर, जब आप एक विधि सूचक का उपयोग करने की जरूरत है; अपने कोड को सरल बनाने के लिए एडाप्टर कक्षाओं को आंतरिक कक्षाओं के रूप में विस्तारित करें।

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

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