2010-11-20 17 views
5

मेरा अंतिम लक्ष्य एक जेएलिस्ट होना है जो रनटाइम पर अपनी सामग्री को रीफ्रेश करता है, और मुझे एक समाधान मिला है जो इस पोस्ट से here on SO पर काम करता है, हालांकि मैं उत्सुक हूं मेरा मूल विचार नहीं था।एक वर्ग के साथ JList .setModel() विधि का प्रयोग

अब के रूप में, मैं इस सेटअप की तरह कुछ है और यह काम करता है:

DefaultListModel default = new DefaultListModel(); 

for(int i = 0; i < array.size() ; ++i){ 
    test.addElement(array.get(i)); 
} 
list.setModel(default); 

नीचे अपने मूल योजना थी। मैं एक वर्ग चाहता था जिसने सूची मॉडल को एक तर्क के रूप में पारित किया, उम्मीद है कि यह जेएलिस्ट को ताज़ा करेगी।

SomeClass test = new SomeClass(); //Implements ListModel 
list.setModel(test); 

या

SomeClass test = new SomeClass(); //Implements ListModel 
list = new JList(test); 

इन काम है, जो मुझे confuses की न तो। क्या ये अंतिम दो विधियां कुछ काम कर सकती हैं, कोड इतना साफ है।

धन्यवाद।

+0

इस वर्ग के उदाहरण के बजाय कक्षा सूची मॉडल पास करना एक कंपिलेटर त्रुटि है। आप भ्रमित क्यों हो रहे हैं? – Istao

+0

मुझे लगता है कि मेरा कोड डेमो थोड़ा भ्रामक माफी है। जो कुछ मैं कर रहा था, मैं इसे और स्पष्ट करने के लिए कोड बदल दूंगा। – Koop

+1

उन अंतिम दो तरीकों का काम क्यों नहीं करते? कृपया जो त्रुटि आप देख रहे हैं उसे प्रदान करें। यदि 'SomeClass'' ListModel' बढ़ाता है, तो उन दोनों विधियों का काम होगा। –

उत्तर

3

यदि आप ListModel को सही तरीके से कार्यान्वित करते हैं तो पहला दृष्टिकोण काम करना चाहिए।

fireContentsChanged(...); 

AbstractListModel (जो मैं तुम्हें विस्तार मान) से: महत्वपूर्ण यह है कि जब आप डेटा को बदलने आप को लागू करने की जरूरत है। इस विधि को आमंत्रित करने से जेएलिस्ट को खुद को पुनर्जीवित करने के लिए कहा जाएगा।

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

+0

fireContentsChanged() को सारसूची सूची या कस्टम विधि का हिस्सा माना जाता है? साथ ही, क्या यह सभी मूल्यों के माध्यम से बस दोहराता है? धन्यवाद। – Koop

+0

जब आप किसी JList में ListModel जोड़ते हैं, तो JList मॉडल में श्रोता जोड़ता है। जब आप मॉडल बदलते हैं, तो मॉडल दृश्य (सूची) को सूचित करता है कि डेटा बदल गया है, इसलिए दृश्य स्वयं को पुनर्जीवित कर सकता है। यह अधिसूचना fireXXX विधियों द्वारा की जाती है जो सारसूची सूची का हिस्सा हैं। यही कारण है कि जब आप एक कस्टम मॉडल बनाते हैं तो आपको अमूर्त मॉडल का विस्तार करना चाहिए, आपको पहिया को फिर से शुरू करने और दृश्य को सूचित करने की आवश्यकता नहीं है। आप जो भी करते हैं वह अनुमोदित fireXXX विधि का आह्वान करता है। – camickr

1

पहला मामला मेरे दिमाग में एक समाधान की तरह लगता है। क्या आप एक टेस्टेबल उदाहरण प्रदान कर सकते हैं?

दूसरा मामला काम नहीं करेगा क्योंकि आप केवल एक चर का उपयोग कर रहे हैं और वास्तव में गुई पर जेएलिस्ट को नहीं बदल रहे हैं। मुझे लगता है कि आप इस सूची को पहले कोड में पहले से जोड़ चुके हैं।

0

सबसे अधिक संभावना है कि ListModel का आपका कार्यान्वयन गलत है।

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