2012-10-16 5 views
5

मैं जानना चाहता हूं कि JScrollBar (मेरे मामले में लंबवत) कब पता है कि JScrollPane के नीचे पहुंच गया है।कैसे पता चलेगा कि JSCrollBar JScrollPane के नीचे पहुंच गया है या नहीं?

पहले मुझे स्क्रॉल बार पर AdjustmentListener का उपयोग करने के बावजूद है, लेकिन मुझे नहीं पता कि value विशेषता का वर्णन कैसे करें। साथ ही मुझे यह समझने की ज़रूरत नहीं है कि maximum क्या दर्शाता है और यदि मैं आवश्यक जानकारी प्राप्त करने के लिए मूल्य के साथ उपयोग कर सकता हूं।

संपादित:

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
    @Override 
    public void adjustmentValueChanged(AdjustmentEvent ae) { 
     System.out.println("Value: " + scrollPane.getVerticalScrollBar().getValue() + " Max: " + scrollPane.getVerticalScrollBar().getMaximum()); 
    } 
} 
+1

आप क्या हासिल करना चाहते हैं? – kleopatra

+0

@ क्लोपेट्रा जब भी स्क्रॉलबार फलक के नीचे पहुंच जाता है तो कुछ करें। – nathan

+1

क्या बात है? जब कोई इस तरह के प्रश्न पूछता है तो कृपया अधिक विशिष्ट रहें। –

उत्तर

9

आप अपने गणना करने के लिए स्क्रॉलबार की हद तक जोड़ने के लिए। मैंने नीचे दिए गए उदाहरण में कोड को आपके कोड में जोड़ा।

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 
    @Override 
    public void adjustmentValueChanged(AdjustmentEvent ae) { 
     int extent = scrollPane.getVerticalScrollBar().getModel().getExtent(); 
     System.out.println("Value: " + (scrollPane.getVerticalScrollBar().getValue()+extent) + " Max: " + scrollPane.getVerticalScrollBar().getMaximum()); 
    } 
} 

दो वैकल्पिक कार्यान्वयन

scrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 

    @Override 
    public void adjustmentValueChanged(AdjustmentEvent event) { 
     JScrollBar scrollBar = (JScrollBar) event.getAdjustable(); 
     int extent = scrollBar.getModel().getExtent(); 
     System.out.println("1. Value: " + (scrollBar.getValue() + extent) + " Max: " + scrollBar.getMaximum()); 

    } 
}); 

या के माध्यम से मॉडल

scrollPane.getVerticalScrollBar().getModel().addChangeListener(new ChangeListener() { 

    @Override 
    public void stateChanged(ChangeEvent event) { 
     BoundedRangeModel model = (BoundedRangeModel) event.getSource(); 
     int extent = model.getExtent(); 
     int maximum = model.getMaximum(); 
     int value = model.getValue(); 

     System.out.println("2. Value: " + (value + extent) + " Max: " + maximum); 

    } 
}); 
+0

मूल रूप से सही :-) scrollPane तक पहुंचने पर नाइटपिकिंग और अपने क्षेत्र में गहरी डाइविंग घटना से पूछताछ करके इसे प्राप्त कर सकते हैं ... – kleopatra

+0

@ क्लोपेट्रा मैं सहमत हूं, मैंने अभी कोडिंग शैली के साथ संगत होने की कोशिश की है जो नाथन का उपयोग कर रहा था। – JeroenWarmerdam

+0

@ क्लोपेट्रा क्या आप अपना उत्तर दे सकते हैं? :) – nathan

-1
scrollBar.getValue()==scrollBar.getMaximum() 
+1

हम। जब मैंने समायोजन ईवेंट निकाल दिया है और यह अधिकतम मूल्य तक कभी नहीं पहुंचता है, तो मैंने पहले ही * मूल्य * संपत्ति का मान प्रदर्शित करने का प्रयास किया है। तो मुझे लगता है कि आपकी हालत कभी सत्यापित नहीं होगी। – nathan

+0

मेरा प्रश्न संपादित किया गया। – nathan

+1

इस कोड लाइन का उपयोग करके [एडजस्टमेंट लिस्टर लागू करने के लिए आवश्यक नहीं है] (http://stackoverflow.com/a/12707995/714968) – mKorbel

1

(आंशिक रूप से Kleopatra पर प्रतिक्रिया) jScrollPane के व्यूपोर्ट का उपयोग करके अगर व्यूपोर्ट है आप गणना कर सकते हैं घटक के अंत को देख रहे हैं।

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 


public class ViewPortDemo extends JPanel{ 

    public ViewPortDemo(){ 
     super(); 
     JTree tree = new JTree(); 
     for(int i =0; i < tree.getRowCount(); i++){ 
      tree.expandRow(i); 
     } 

     final JScrollPane pane = new JScrollPane(tree){ 
      Dimension prefSize = new Dimension(200,150); 
      public Dimension getPreferredSize(){ 
       return prefSize; 
      } 
     }; 

     pane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() { 

      @Override 
      public void adjustmentValueChanged(AdjustmentEvent e) { 
       JViewport vp = pane.getViewport(); 
       if(vp.getView().getHeight() <= vp.getHeight() + vp.getViewPosition().y){ 
        System.out.println("End"); 
       } 
      } 
     }); 

     add(pane); 
    } 


    public static void main(String[] args){ 
     final JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new ViewPortDemo()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+0

आकार से कुछ गणना करने की कोई आवश्यकता नहीं है - समायोज्य में सभी जानकारी की आवश्यकता है ;-) – kleopatra

3

@StanislavL लगभग सही जवाब था।

scrollBar.getValue() == scrollBar.getMaximum() - scrollBar.getVisibleAmount() आज़माएं।

यह समझने के लिए कि getVisibleAmount() कॉल आवश्यक क्यों है, आपको पहले समझना होगा कि JSCrollBars कैसे काम करता है। एक JScrollBar में 4 मान हैं: न्यूनतम, अधिकतम, मान, और सीमा। value स्क्रॉल हैंडल का शीर्ष है, और extent स्क्रॉल हैंडल की प्रभावी लंबाई है। value कभी भी maximum के बराबर नहीं होगा जब तक कि स्क्रॉल हैंडल की लंबाई 0 न हो। क्षतिपूर्ति करने के लिए, हमें उस अधिकतम मूल्य को समायोजित करना होगा जिसे हम प्रभावी अधिकतम प्राप्त करने के लिए स्क्रॉल हैंडल की लंबाई घटाकर तुलना कर रहे हैं।

इस आशय here प्रलेखित है, जो गुमराह यह ध्वनि getMaximum() की तरह यह होना चाहिए मूल्य समायोजित कर देता है, लेकिन implementation of JScrollBar पर बारीकी से देख पता चलता है कि getMaximum() वास्तव में हमें सच अधिकतम, नहीं प्रभावी अधिकतम देता है की तरह बना देता है।

+1

यह अद्भुत एक-लाइनर निश्चित रूप से उत्तर होना चाहिए! व्यूपोर्ट्स आदि के बिना एक सरल जवाब। लगभग 2 वर्षों के बाद बहुत बहुत धन्यवाद! – geisterfurz007

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

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