ScrollPaneのサンプルプログラム

   2012/04/26

窓(Frame)に入りきらないほど大きな画像を表示する場合には
(1)縮小して表示する
(2)スクロール表示できるようにする
の2とおりの処理が考えられます。

毎度、管理人イガジーです。

(1)の処理は、drawImage()で比較的簡単に実現できますが
画像によっては細い線がつぶれてしまったりします。

(2)の処理は面倒に思えますが、ScrollPane というクラスを使うと
意外に簡単に実現できます。

例を以下に示します。

public class ScrlPane extends Frame {
	private static final long serialVersionUID = 1L;
	int ww=340,hh=240;
	BufferedImage bb;
	MyCanvas cv;

	ScrlPane(){ // constructor
		this.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent e){
				System.exit(0);
			}
		});
		this.setTitle("Sample of ScrollPane");
		ScrollPane sp=new ScrollPane();
		cv=new MyCanvas(ww,hh);
		cv.setSize(ww,hh);
		Graphics g=bb.getGraphics();
		this.add(sp,BorderLayout.CENTER);
		sp.add(cv);
		g.setColor(Color.RED);
		g.fillRect(20,20,ww-40,hh-40);
		this.setSize(300,200);
		this.setVisible(true);
	} // constructor

	public static void main(String[] args) {
		new ScrlPane();
	} // main()

	class MyCanvas extends Canvas {
		private static final long serialVersionUID = 1L;
		MyCanvas(int w,int h){
			bb=new BufferedImage(w,h,BufferedImage.TYPE_INT_RGB);
		}
		@Override
		public void paint(Graphics g0) {
			g0.drawImage(bb,0,0,null);
		}
	} // class MCanvas
}

(Import文は省略しています)
300×200のFrameに、ScrollPaneを置き、その中に340×240 の
Canvasを置いて(ScrollPaneで)スクロール表示させています。

表示させている状態で、Frame自体をマウスで広げてゆくと
ある所(※)でスクロールバーが消えます。
(※ スクロールしなくても全体が表示できるサイズになった時)

広げたあとで、逆にFrameを小さくするとスクロールバーが
再度表示されるのですが、ちょっと期待と違う範囲がスクロール対象になります。
(BorderLayoutを使用しているため、Frameのサイズを広げた際に
Canvasサイズも大きくなるのがその理由)

ScrollPaneを置くだけで、この様にスクロール処理ができるのでとても便利です。