2012-05-02 11 views
8

मेरे पास JScrollPane है जिसमें क्षैतिज पंक्ति में कुछ छवियां हैं। यदि दृश्य पोर्ट के लिए छवियों की पंक्ति बहुत लंबी है, तो JSCrollPane दृश्य पोर्ट की ऊंचाई को कम करने, स्क्रॉल बार दिखाता है। मैं दृश्य पोर्ट फिट करने के लिए छवियों का आकार बदलना चाहता हूं। मैं कैसे पता लगा सकता हूं कि व्यू पोर्ट ने अपना आकार बदल दिया? दुर्भाग्यवश, परिवर्तन ईवेंट हैंडलर पंजीकृत करना प्रतीत नहीं होता है।मैं कैसे पता लगा सकता हूं कि कोई JScrollPane की स्क्रॉल बार दृश्यता बदलती है या नहीं?

उत्तर

12

व्यूपोर्ट पर परिवर्तन श्रोता का उपयोग करना मेरे लिए काम करता प्रतीत होता है।

import java.awt.BorderLayout; 
import java.io.UnsupportedEncodingException; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.SwingWorker; 
import javax.swing.event.ChangeEvent; 
import javax.swing.event.ChangeListener; 

public class Main { 

    public static void main(String[] args) throws UnsupportedEncodingException { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     JPanel panel = new JPanel(new BorderLayout()); 
     final JPanel buttons = new JPanel(); 
     final JScrollPane pane = new JScrollPane(buttons); 
     pane.getViewport().addChangeListener(new ChangeListener() { 

      @Override 
      public void stateChanged(ChangeEvent e) { 
       System.err.println("Change in " + e.getSource()); 
       System.err.println("Vertical visible? " + pane.getVerticalScrollBar().isVisible()); 
       System.err.println("Horizontal visible? " + pane.getHorizontalScrollBar().isVisible()); 
      } 
     }); 
     panel.add(pane); 
     frame.setContentPane(panel); 
     frame.setSize(300, 200); 
     frame.setVisible(true); 
     SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() { 

      @Override 
      protected Void doInBackground() throws Exception { 
       for (int i = 0; i < 10; i++) { 
        Thread.sleep(800); 
        buttons.add(new JButton("Hello " + i)); 
        buttons.revalidate(); 
       } 
       return null; 
      } 
     }; 
     worker.execute(); 
    } 
} 
+0

ठीक है यहाँ कि का एक छोटा सा डेमो है , अजीब। जल्दी जवाब देने का शुक्रिया। मैंने कोशिश की और यह वास्तव में काम करता है। हां, मेरे आवेदन के अंदर, एक परिवर्तन श्रोता जोड़ना काम नहीं करता है। मैं यहाँ से काम करूंगा। – xmjx

+0

कुछ अजीब कारणों के लिए stdout और stderr दोनों के आउटपुट श्रोता में प्रदर्शित नहीं किए गए थे। तो यह मूल रूप से एक डीबगिंग समस्या थी। एक बार फिर धन्यवाद। – xmjx

1

मैं jScrollPane के आकार में परिवर्तन का पता लगाने के लिए इस्तेमाल किया HierarchyBoundsListener:

onAncestorResized(scroll, evt -> resizeYourImages()); 

यहाँ है श्रोता संलग्न के लिए एक सुविधा विधि:

static void onAncestorResized(JComponent component, Consumer<HierarchyEvent> callback) { 
    component.addHierarchyBoundsListener(new HierarchyBoundsAdapter() { 
     @Override 
     public void ancestorResized(HierarchyEvent e) { 
      callback.accept(e); 
     } 
    }); 
}