ScrollPaneのサンプルプログラム
窓(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を置くだけで、この様にスクロール処理ができるのでとても便利です。