2010-01-25 13 views
13

मैं अगले कोड मिल गया है:jScrollPane और JList ऑटो स्क्रॉल

listModel = new DefaultListModel(); 
    listModel.addElement(dateFormat.format(new Date()) + ": Msg1"); 
    messageList = new JList(listModel); 
    messageList.setLayoutOrientation(JList.VERTICAL); 

    messageScrollList = new JScrollPane(messageList); 
    messageScrollList.setPreferredSize(new Dimension(500, 200)); 

    messageScrollList.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     public void adjustmentValueChanged(AdjustmentEvent e) { 
      e.getAdjustable().setValue(e.getAdjustable().getMaximum()); 
     } 
    }); 

यह ऑटो स्क्रॉल नीचे। लेकिन, अगर मैं एक संदेश को फिर से पढ़ने के लिए बैक अप लेने का प्रयास करता हूं, तो यह एक स्क्रॉल को मजबूर करता है। मैं इसे कैसे ठीक कर सकता हूं?

उत्तर

10

जब नया संदेश जोड़ने, एक Rectangle का उपयोग कर अपने संदेश फलक के पसंदीदा आकार के रूप में एक ही आयाम होने JList पर scrollRectToVisible() आह्वान। लंबवत अभिविन्यास को देखते हुए, JScrollPane के JViewport के पसंदीदा आकार को संदेश फलक की ऊंचाई का एक अभिन्न अंग बनाना सुविधाजनक हो सकता है। यह भी देखें: How to Use Scroll Panes

परिशिष्ट: Text Area Scrolling की यह आकर्षक चर्चा भी उपयोगी हो सकती है।

-1

मुझे लगता है कि आप जो करना चाहते हैं वह है जब आप अपने संदेश सूची में सामान जोड़ते हैं, तो समायोजन पर। तो अपने कोड ऐसा दिखाई दे सकता:

Adjustable sb = messageScrollList.getVerticalScrollBar() 
boolean onBottom = sb.getValue() == sb.getMaximum(); 
// 
// add your message to the JList. 
// 
if(onBottom) sb.setValue(sb.getMaximum()); 
अन्यथा

आप अगर वहाँ एक है, तो समायोजन एक मॉडल परिवर्तन की वजह से किया गया था, या माउस से, और एपीआई डॉक्स के माध्यम से देख मुझे यकीन है कि नहीं कर रहा हूँ बताने के लिए की आवश्यकता होगी आसानी से ऐसा करने का तरीका। यद्यपि आप देख सकते हैं कि AdjustmentEvent.getAdjustmentType() उन मामलों में अलग-अलग मान देता है, यदि यह सत्य है तो आपके पास अपने अज्ञात आंतरिक वर्ग में केवल एक कथन हो सकता है।

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

+0

समायोजन प्रकार दोनों मामलों में समान है। अगर कोई संदेश जोड़ा जाता है तो मैंने इसे स्क्रॉल करने की कोशिश की है। लेकिन अगर मैं ऐसा करता हूं, तो अंतिम जोड़ा गया संदेश दिखाई नहीं दे रहा है। यह पर्याप्त नीचे स्क्रॉल नहीं करता है। मैं इसे कैसे हल कर सकता हूं? – dododedodonl

+0

हम्म ... ठीक है, एक चीज जो आप कर सकते हैं वह एक बूलियन वैरिएबल होगा जहां आप सूची में कुछ जोड़ते हैं। फिर, अपने हैंडलर में आप यह देखने के लिए जांचते हैं कि चर सेट है या नहीं। यदि ऐसा है, तो आप समायोजन (और चर को अनसेट करें) अन्यथा, आप इसे अनदेखा करते हैं। इस तरह, सूची में प्रति आइटम केवल एक स्क्रॉल-डाउन जोड़ा जाएगा। –

1
this.list = blah blah... 
this.list.setSelectedValue(whatever); 
final JScrollPane sp = new JScrollPane(this.list); // needs to be after the parent is the sp 
this.list.ensureIndexIsVisible(this.list.getSelectedIndex()); 
1

मैं इस पाया वास्तव में उपयोगी: http://forums.sun.com/thread.jspa?threadID=623669 (पोस्ट 'inopia' द्वारा)
यह पूरी तरह से काम करता है

वह कहते हैं: "समस्या यहाँ यह थोड़ा खोजने के लिए मुश्किल हो सकता है वह यह है कि ListModel, JList और JScrollPane दोनों के बाद आग लगने वाली एक घटना को अद्यतन कर दिया गया है। "

+0

लिंक मर चुका है। क्या आप इसे रीफ्रेश कर सकते हैं? –

0
ऑटो स्क्रॉल करने के लिए

मैं स्थिर चर और list.makeVisible (पूर्णांक सूचकांक)

public class autoScrollExample 
    { 
    static int index=0; 
    private void someFunction() 
    /* 
    * 
    */ 
    list1.add("element1"); 
    list1.makeVisible(index++); 
    /* 
    * 
    */ 

    private void someOtherFunction() 
    /* 
    * 
    */ 
    list1.add("element2"); 
    list1.makeVisible(index++); 
    /* 
    * 
    */ 


    } 
1

@question इन्क्वायरर की एक बहुत ही सरल अवधारणा का उपयोग कर रहा हूँ। कृपया

messageScrollList.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     public void adjustmentValueChanged(AdjustmentEvent e) { 
      e.getAdjustable().setValue(e.getAdjustable().getValue()); 
     } 
    }); 

को

messageScrollList.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
     public void adjustmentValueChanged(AdjustmentEvent e) { 
      e.getAdjustable().setValue(e.getAdjustable().getMaximum()); 
     } 
    }); 

से अपने कोड बदलने परिवर्तन getMaximum()getValue() को तो यह काम करता है के रूप में आवश्यक है कि। getMaximum() स्क्रोलर को अधिकतम पर ले जाता है; जबकि getValue() जहां भी घटना होती है वहां ले जाती है।

आप पूरी तरह कोड के इस टुकड़े का उपयोग कर यदि आप एक पंक्ति

messageScrollList.setViewportView(messageList); 

कि JList के लिए add(component) तरह काम करता है और अपने निहित व्यवहार हो जाता है डाल से बच सकते हैं।