2012-05-02 6 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

私は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); 
     } 
    }); 
} 
関連する問題