2012-05-02 94 views
8

我有JScrollPane,其中包含一些水平行圖像。如果該圖像行對於視口太長,則JScrollPane會顯示一個滾動條,從而減小視口的高度。我想調整圖像大小以適合視圖端口。我如何檢測視圖端口改變了它的大小?不幸的是,註冊更改事件處理程序似乎不起作用。如何檢測JScrollPane的滾動條是否改變可視性?

回答

12

在ViewPort上使用更改偵聽器似乎適用於我。這裏是一個小的演示:

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

我用HierarchyBoundsListener來檢測JScrollPane中的尺寸變化:

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); 
     } 
    }); 
}