2009-05-03 14 views
5

मैंJList अंदर बदलते समय JScrollPane डिस्प्ले स्क्रॉलबार बनाएं

myList.setListData(someArray); 

का उपयोग कर गतिशील रूप से जेएसक्रॉलपैन के अंदर एक जेएलिस्ट को बदलने की कोशिश कर रहा हूं, इसके बाद मैं उम्मीद करता हूं कि JScrollPane स्क्रॉलबार को आवश्यकतानुसार दिखाएगा, लेकिन ऐसा नहीं होता है। इस मुद्दे पर गुगल करना बहुत उपयोगी नहीं था। मैंने निम्न विधियों के विभिन्न संयोजनों की कोशिश की, कम सफलता के साथ (मूल रूप से एपीआई दस्तावेज़ों के माध्यम से पोकिंग):

myScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 
myList.validate(); myScrollPane.validate(); 
myScrollPane.setPreferredSize(Dimension someDimension); 
myScrollPane.setViewportView(moduleList); 
myScrollPane.setLayout(...); 

पहली विधि का उपयोग करते समय एक स्क्रॉलबार दिखाई देता है, लेकिन यह मॉडल परिवर्तन से सक्रिय नहीं होता है। मैंने PropertyChangeEvent में भी लगाया और यह सत्यापित किया कि मॉडल बदलते समय जेएलिस्ट आग और घटना। मुझे यहां क्या समझ नहीं आ रहा है? इस काम को करने के लिए मुझे किस विधि का उपयोग करना है, या यह भी बेहतर है कि यह संपत्ति बॉक्स से बाहर क्या काम करेगी?

+1

यह सुनिश्चित नहीं है कि इससे मदद मिलेगी, लेकिन सुनिश्चित करें कि सेट करने के लिए आपका कॉल ईवेंट थ्रेड पर ...()) होता है। यदि आप एक अलग थ्रेड पर यूआई ऑब्जेक्ट को बदलते हैं तो सभी प्रकार की ग़लत चीजें हो सकती हैं। इसके अलावा, क्या आपने JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED को देखा है? यह बिल्कुल स्पष्ट नहीं है कि "मॉडल परिवर्तन द्वारा सक्रिय" से आपका क्या मतलब है। –

उत्तर

9

अगर preferredSize JList पर सेट कर दिया जाता है, भले ही (0, 0), तो jScrollPane काम नहीं करता है - सुनिश्चित करें कि यह सेट नहीं होने पर setPreferredSize (शून्य) यदि आवश्यक हो तो

mrtextminer देखने के रूप में

इस प्रकार है

इस समस्या का समाधान JList (सेटिंग कथन को हटाने) के पसंदीदा आकार को सेट नहीं करना है। नेटबीन्स आईडीई 5.5.1 में, जेएलिस्ट के पसंदीदा आकार को अनसेट करने के लिए जेएलिस्ट की पसंदीदा आकार संपत्ति पर राइट क्लिक करके और फिर "डिफ़ॉल्ट मान बहाल करना" चुनकर हासिल किया जा सकता है।

निष्कर्ष में, केवल JScrollPane के पसंदीदा आकार सेट करें।जेएलिस्ट के पसंदीदा आकार को सेट न करें।

+0

वास्तव में मेरे अनुप्रयोगों में से एक में एक लंबे समय से चलने वाली बग तय की गई। धन्यवाद। :) – Bombe

3

इस व्यवहार का परीक्षण करने के लिए बस थोड़ा सा नमूना ऐप लिखा, और यह बॉक्स से बाहर काम करता है। जब आप सूची डेटा संशोधित करते हैं, तो डिफ़ॉल्ट रूप से आवश्यक स्क्रॉलपैन में लंबवत और क्षैतिज स्क्रॉलबार जोड़े जाते हैं।

public class Frametest { 

private JList list; 

public Frametest() { 
    JFrame f = new JFrame("Scrollable JList"); 
    f.setSize(200, 300); 
    JScrollPane jsp = new JScrollPane();   
    list = new JList(); 
    jsp.getViewport().add(list); 
    f.getContentPane().setLayout(new BorderLayout()); 
    f.getContentPane().add(jsp, BorderLayout.CENTER); 
    JButton button = new JButton("update"); 
    button.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent arg0) { 
      Object[] objects = new Object[20]; 
      for(int i=0; i<20; i++) { 
       objects[i] = "foo foo foo foo foo foo foo foo foo foo foo foo "+i; 
      } 
      list.setListData(objects); 
     } 
    }); 
    f.getContentPane().add(button, BorderLayout.SOUTH); 
    f.setVisible(true);  
} 

public static void main(String[] args) { 
    new Frametest(); 
}} 
+0

मुझे संदेह है कि वह डेटा जोड़ सकता है जब सूची मॉडल परिवर्तन के बारे में बात कर रही है, तो सूची दिखाई दे रही है ... – willcodejavaforfood

+0

हाँ, यह उदाहरण में काम कर रहा है! जब आप अपडेट बटन दबाते हैं (सूची पहले से ही दिखाई दे दी गई है), मॉडल बदल दिया गया है और स्क्रॉलबार समायोजित किए गए हैं। –

+0

हां, मैं वही कर रहा हूं जो आपने किया था, लेकिन आपका कोड मेरे लिए काम करता है - मुझे लगता है कि मैं क्या नहीं कर रहा हूं ... मुझे संदेह है कि यह लेआउट के साथ कुछ हो सकता है - धन्यवाद! – VolkA

2

आप सूची डेटा में परिवर्तन करने पर JList की validate या revalidate विधि कॉल करने की कोशिश की है?

myList.setListData(someArray); 
myList.revalidate(); 
बस आपकी जानकारी के लिए

, मैं सिर्फ, validate और revalidate के बीच अंतर की एक त्वरित जांच किया था और यह है कि validate जाएगा घटक के लिए लेआउट विधि पर और उसके बच्चों बुलाया गया था लगता है, जबकि revalidate होगा अपने उच्चतम माता-पिता तक सभी तरह से जाएं और फिर अपने सभी बच्चों के लिए लेआउट परिवर्तन करें।

myList पर revalidate कॉलिंग केवल सूची ही मान्य होगा नहीं, लेकिन यह भी पुस्तक फलक को मान्य रूप में अच्छी तरह होगा, इसलिए, आइटम के आधार पर स्क्रॉल पट्टी की दृश्यता को प्रभावित करने वाले सूची में तैयार किया जा रहा।

+0

हाँ, मैंने दोनों की कोशिश की, लेकिन बिना किसी प्रभाव के ... – VolkA

1

यह गलत लग रहा है:

jsp.getViewport().add(list); 

इसके बजाय का उपयोग करें:

jsp.setViewportView(list); 

या

new JScrollPane(list); 

और सूची Scrollpane को सही ढंग से जोड़ दिया जाएगा। इसे जोड़ने से स्क्रॉलपैन को बदलावों के लिए इसे सुनने के लिए कहा जाता है।

1

आप अभी भी इस सत्यापित करें तरीकों निकालने का प्रयास करें और यदि आप सूची पर एक setpreferredsize है इसे हटाने, कि कैसे मेरा

में गड़बड़ मैं

resultList.setPreferredSize(resultList.getPreferredSize()); 

हटा दिया और यह हो गया था की जरूरत है किया

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