2009-04-13 15 views
15

मेरे जीयूआई में एक ड्रॉपडाउन बॉक्स है जो किसी अन्य वर्ग में एक ऐरेलिस्ट की सामग्री दिखाता है। नई वस्तुओं को GUI में कहीं और ArrayList में जोड़ा जा सकता है, इसलिए मुझे यह पता होना चाहिए कि यह कब अपडेट किया गया है, इसलिए मैं ड्रॉपडाउन मेनू को रीफ्रेश कर सकता हूं। जो मैं इकट्ठा कर सकता हूं, उससे मेरे दो विकल्प ArrayList क्लास को विस्तारित करने के लिए हैं ताकि मुझे अपना स्वयं का परिवर्तन जोड़ने की अनुमति मिल सके, या उस वर्ग को बनाने के लिए जिसमें प्रश्न में ऐरेलिस्ट शामिल है, देखने योग्य हो।क्या मुझे श्रोता या पर्यवेक्षक का उपयोग करना चाहिए?

कौन सा उचित समाधान होगा?

+1

आप एक JComboBox की चर्चा करते हुए कर रहे हैं? यदि ऐसा है, तो मैं कॉम्बोबॉक्स मॉडेल और इसके कार्यान्वयन में देखता हूं। – Avrom

उत्तर

10

दो समाधान अनिवार्य रूप से एक ही रूट डिजाइन पैटर्न के कार्यान्वयन के रूप में द्वारा परिभाषित कर रहे हैं ("पर्यवेक्षक" पैटर्न चार की गिरोह।) पूर्व मामले में, आप ऐरेलिस्ट को स्वयं "अवलोकन" बना रहे हैं, बाद में आप डोमेन ऑब्जेक्ट बना रहे हैं जो सरणी सूची "अवलोकन योग्य" का उपयोग करता है।

मेरी प्रवृत्ति उत्तरार्द्ध करने के लिए होगी: डोमेन ऑब्जेक्ट को देखने योग्य बनाएं। यह मुख्य रूप से इसलिए है क्योंकि आपके पास अंततः अन्य चीजें हो सकती हैं जो डोमेन ऑब्जेक्ट के बारे में बदल सकती हैं (जिसके लिए जीयूआई अपडेट किया जाना चाहिए।) यदि यह पहले से ही देखा जा सकता है, तो आप पहले से ही सेट हैं।

ध्यान दें कि आपको सख्ती से java.util.Observable का विस्तार नहीं करना है - आप इसे किए बिना डिज़ाइन पैटर्न को कार्यान्वित कर सकते हैं।

+0

यह सबसे आसान तरीका लगता है, हालांकि अन्य सभी उत्तरों के लिए धन्यवाद। – Simonw

9

Observable जावा में कार्यान्वयन का शायद ही कभी उपयोग किया जाता है, और स्विंग के साथ अच्छी तरह से संचालन नहीं करता है। इसके बजाय EventListener का उपयोग करें।

विशेष रूप से, AbstractListModel का विस्तार न करने का कोई कारण नहीं है या "जीयूआई में कहीं और" सूची की सामग्री का प्रबंधन करते समय सीधे DefaultListModel का उपयोग करें? फिर आपका कॉम्बो बॉक्स ComboBoxModel का उपयोग कर सकता है जो कि ListModel उदाहरण के लिए प्रतिनिधि करता है, चयन स्थिति को ट्रैक करने के लिए अपना स्वयं का कार्यान्वयन जोड़ता है।

मैं इस तरह मन कुछ में है (लेकिन मैं यह परीक्षण नहीं किया है):

final class MyComboBoxModel 
    extends AbstractListModel 
    implements ComboBoxModel 
{ 

    private final ListModel data; 

    private volatile Object selection; 

    MyComboBoxModel(ListModel data) { 
    /* 
    * Construct this object with a reference to your list, 
    * which contents are managed somewhere else in the UI. 
    */ 
    this.data = data; 
    data.addListDataListener(new ListDataListener() { 
     public void contentsChanged(ListDataEvent evt) { 
     fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
     } 
     public void intervalAdded(ListDataEvent evt) { 
     fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
     } 
     public void intervalRemoved(ListDataEvent evt) { 
     fireContentsChanged(this, evt.getIndex0(), evt.getIndex1()); 
     } 
    }); 
    } 

    public void setSelectedItem(Object selection) { 
    this.selection = selection; 
    fireContentsChanged(this, 0, data.getSize() - 1); 
    } 

    public Object getSelectedItem() { return selection; } 

    public int getSize() { return data.getSize(); } 

    public Object getElementAt(int idx) { return data.getElementAt(idx); } 

} 
1

हमेशा एक्सटेंशन पर संरचना पसंद करते हैं (मेरा संदर्भ प्रभावी जावा और मेरा व्यक्तिगत अनुभव है)। ArrayList का विस्तार करना केवल एक वादा है कि आप किसी भी वर्ग के इनवेरिएंट का उल्लंघन नहीं करेंगे। यह आपके द्वारा विस्तारित विशिष्ट सूची कार्यान्वयन के लिए भी बाध्य करता है।

0

आप GUI design pattern का उपयोग करने के लिए स्विच कर सकते हैं। या एक सीमित कार्यान्वयन का निर्माण।

एक जीयूआई फार्म इंटरफ़ेस एक विधि DrawXArrayList (एक्स कुछ meaningfull नाम होने के साथ बनाएं जिसमें यह प्रकार ArrayList

GUIView नामक एक नई कक्षा बनाएं का एक पैरामीटर यह कम से कम दो विधियों है:।। UpdateXArrayList, और RegisterForm

जब आप अपने आवेदन को प्रारंभ जीयूआई फार्म GUIView को लागू करने वर्ग के साथ ही रजिस्टर। वर्ग GUIView प्रपत्र को दिखाई लागू करने सुनिश्चित की है।

अपने जीयूआई फार्म में कुछ भी अपडेट हो जाता है जब ArrayList यह रूप में UpdateXArrayList कॉल आखिरी चीज यह करता है GUIView को लागू करने वाले वर्ग में e UpdateXArrayList विधि बदले में अद्यतन DrawXArrayList को अपडेट की गई सरणीसूची को पास कर देगा। GUIFormInterface को लागू करने वाले फॉर्म क्लास में DrawXArrayList तब ArrayList को प्रदर्शित करने वाले नियंत्रण को अपडेट करने के लिए चरणों को ले जाएगा।

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

2

बाइंडिंग का उपयोग क्यों नहीं करें?

http://wiki.eclipse.org/index.php/JFace_Data_Binding

अपने लिस्ट में अपने GUI विजेट बाइंड

। परिवर्तन पारदर्शी रूप से दो वस्तुओं के बीच प्रचार करेंगे। अपने मॉडल को उपयुक्त अवलोकन योग्य के साथ लपेटना सुनिश्चित करें, जैसे WritableList (अगर सीधे ArrayList का उपयोग कर रहे हों)।

0

आप आवेदन करने के लिए एक नया जार में जोड़ सकते हैं, तो यह देखें glazed Lists

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