2012-02-23 22 views
5

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

यह इस तरह दिखता है:

a pic1 http://oi44.tinypic.com/20jiix5.jpg

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

a pic2 http://oi42.tinypic.com/2m5exxt.jpg

जब आप छिपाने क्लिक करें (या शो, यह एक टॉगल है) तो यह तो जैसे तत्व को कम करना चाहिए ...

a pic3 http://oi41.tinypic.com/kf3apx.jpg

केवल समस्या है ... ऐसा नहीं जेएलआईस्ट सेल आकार को अपडेट न करें क्योंकि आप बड़े खाली क्षेत्र को देख सकते हैं जहां टेक्स्ट होता था।
हालांकि, जब मैं एक संदेश लिखें ...

a pic4 http://oi40.tinypic.com/35jdoo7.jpg

JList सेल के आकार 'छिपाएं' प्रकार्य पूरा करता है।
मेरा सवाल यह है कि आप JList को प्रोग्रामेटिक रूप से पुन: वैध/पुनर्निर्मित करने के लिए कैसे प्राप्त करते हैं।
और नहीं लगता कि मैं सब स्पष्ट समाधान प्रयास नहीं किया है कि ...

public void setHidden(boolean hidden) { 
    // this is in the custom JPanel class 
    System.out.println("Initial: " + this.getPreferredSize()); 

    // TextArea is the JTextArea which we set invisible when we want to hide it. 
    TextArea.setVisible(!hidden); // TextArea is a variable btw 
    this.invalidate(); 
    this.validate(); 
    this.repaint(); 

    System.out.println("After: " + this.getPreferredSize()); 
    container.revalidate(); 
} 

/* 
* This is what the above printlns show when you hide, then show the element. 
* 
* Initial: java.awt.Dimension[width=176,height=38] 
* After: java.awt.Dimension[width=176,height=20] 
* Initial: java.awt.Dimension[width=176,height=20] 
* After: java.awt.Dimension[width=176,height=38] 
*/ 

public void revalidate() { 
    // container.revalidate() ^^^ 
    // list is the list containing the chat elements 
    list.invalidate(); 
    list.validate(); 
    list.repaint(); 
} 

कस्टम JPanel वर्ग एक GroupLayout का उपयोग करता घटकों रेंडर करने के लिए।
क्या आपको लोगों को कोई ज्ञान है कि प्रोग्रामर के रूप में जेएलिस्ट को अपने सेल आकार को फिर से सत्यापित करने का तरीका क्या है?
... मेरे द्वारा पोस्ट की गई विधियों के अलावा? :)

समाधान:
विधि के बाद विधि खोज और यदि वे मेरी समस्या का समाधान होगा परीक्षण के बाद, मैंने पाया कि एक छिपाने/शो ऑपरेशन के बाद इस कोड को क्रियान्वित करने सेल ऊंचाई (और चौड़ाई) का कारण होता है पुनर्गणना किया जाना है और जेएलिस्ट के किसी भी अवांछित दृश्य 'झिलमिलाहट' के बिना।

list.setFixedCellHeight(0); 
list.setFixedCellWidth(0); 
list.setFixedCellHeight(-1); 
list.setFixedCellWidth(-1); 
+0

कृपया जावा नामकरण सम्मेलनों को सीखें और उन्हें चिपकाएं – kleopatra

+0

मुझे जावा नामकरण सम्मेलन पता है, मुझे बस अपने स्विंग चर के ऊपरी मामले की तरह लगता है। लेकिन मैं हमेशा इसका पालन नहीं करता ... –

उत्तर

2

यह TableModel में और दिखाई Chat कॉलम के साथ दो कॉलम (Chat और Boolean) के साथ JTable के लिए काम है केवल, चाल से का उपयोग कर लागू RowFilter जहां दूसरे स्तंभ के लिए पैरामीटर के रूप में सेट कर रहा है केवल String "false" , किसी भी कोड को देखने के बिना

+0

आपका व्याकरण आपके उत्तर को शायद ही समझ में आता है। यह जेटेबल सेल आकार बदलने को कैसे ठीक करेगा? और आपको याद रखना होगा कि मैं इस जेएलिस्ट को प्रस्तुत करने के लिए एक कस्टम सेल रेंडरर का उपयोग कर रहा हूं। यह प्रदर्शित नहीं करेगा कि यह इसके बिना क्या करता है। –

+0

@ ब्रैडली ओडेल कृपया मॉडल के बारे में ट्यूटोरियल [जेएलिस्ट] (http://docs.oracle.com/javase/tutorial/uiswing/components/list.html) पढ़ें (डेटा संग्रहित है) और देखें और इसकी प्रतिपादन, कभी नहीं अमान्य उपयोग नहीं करें() – mKorbel

3

(ObjectBoolean साथ JTable में String "true"/"false" में रिटर्न मूल्य के साथ संभव छानने है) मैं केवल अनुमान लगा सकते हैं: सबसे संभावित कारण यह है कि आप एल के पैरों के नीचे छिपाने कर रहे है आईएसटी, जो इसके श्रोताओं को सूचित करने वाले मॉडल के बिना है।सूची का यूई प्रतिनिधि सेल आकार का गहरा अंदर कैश करता है, जिसे ListEvents

+0

आपको लगता है कि मैं जेएलिस्ट के नीचे शारीरिक रूप से अपने कर्सर के साथ तत्व पर राइट-क्लिक कर रहा हूं और छुपा रहा हूं? यह तब होता है जब मैं तत्व को 'छुपा' करता हूं वह JTextArea (जिसमें चैट संदेश होता है) अदृश्य सेट किया जा रहा है। तो जब इसकी दृश्यता बदल जाती है, तो मुझे उस तत्व के लिए अपने सेल आकार को फिर से समझने के लिए जेएलिस्ट की आवश्यकता होती है। –

0

प्राप्त करने पर साफ़ किया जाता है यह JList कक्षा का एक बहुत ही कमजोर कमी है। मैं असंबद्ध क्षेत्रों में अपने कुछ कोड को साफ करने के दौरान खुद को इस मुद्दे में भाग गया।

ListModel से तत्व को हटाने के लिए, और फिर इसे जोड़ने से JList में संबंधित प्रस्तुत घटक के लिए उपयुक्त आयाम उत्पन्न होंगे। यह इसके बारे में जाने के लिए एक अजीब तरीका है, और के रूप में स्वीकार (और पसंदीदा) हल उसी तरह व्यवहार करने के लिए सूची का कारण लगता है: क्योंकि मेरी परियोजना के लिए कोड मूल रूप से लिखा गया था

list.setFixedCellHeight(0); 
list.setFixedCellWidth(0); 
list.setFixedCellHeight(-1); 
list.setFixedCellWidth(-1); 

मैं इस समस्या पर ठोकर खाई ListModel की removeAllElements() विधि का आह्वान करने के लिए और फिर addElement() का उपयोग करके सभी तत्वों को एक-एक करके जोड़ें। जब तक मैंने फैसला नहीं किया कि मुझे प्रोग्राम को फिर से लिखना चाहिए, तब तक सबकुछ बढ़िया काम कर रहा था ताकि उपयोगकर्ता द्वारा अनुरोध किए गए जेएलआईस्ट में प्रदर्शित घटकों के आयामों में बदलाव होने पर यह मॉडल को अकेले छोड़ दे। दूसरे शब्दों में, मॉडल को शामिल करना अनावश्यक था क्योंकि तत्वों को सूची से जोड़ा या हटाया नहीं जा रहा था। दुर्भाग्यवश, रेंडरर के पसंदीदा आकार को बदलने के बाद, या revalidate() की कोई राशि JList पर विधि कॉल को इसके तत्वों को सही तरीके से लेआउट करने का कारण बनती है। मेरे मामले में, केवल मूल घटक का आकार बदलना (JFrame) ने इच्छित व्यवहार का उत्पादन किया।

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