ScrollPane と マウスwheelでのスクロール

 

GUIの場合、使用者が窓(Frame)の大きさを変更した時に
どう追随するか(どう表示するか)は色々と悩ましい問題です。

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

想定しているサイズより窓(Frame)が小さくなったら(あるいは最初から)
中身をスクロール表示させたいという時には、ScrollPane というクラスが
役に立ちます。

使い方は簡単で、Panel あるいは Canvas などを、ScrollPane に add して
その ScrollPane を Frame に add するだけです。
即ち、Frame と 中身(Panel など)の間に ScrollPane を介在させるだけです。
以下にプログラム例を示しましょう。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.Panel;
import java.awt.Point;
import java.awt.ScrollPane;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class ScPane {
	Frame f0;
	ScrollPane sp;

	final int lines=20;
	ScPane(){
		f0=new Frame("ScrollPane");
		f0.addWindowListener(new WindowAdapter(){
			public void windowClosing(WindowEvent ev) {
				System.exit(0);
			}
		});

		sp=new ScrollPane();
		Panel p0=new Panel(new GridLayout(lines,1));
		Label []lb=new Label[lines];
		for (int i=0;i<lines;++i) {
			lb[i]=new Label("L "+Integer.toString(i+1));
			lb[i].setAlignment(Label.CENTER);
			if ((i&1)==0) lb[i].setBackground(Color.YELLOW);
			else lb[i].setBackground(Color.LIGHT_GRAY);
			p0.add(lb[i]);
		}
		sp.add(p0);
		f0.add(sp,BorderLayout.CENTER);
		f0.setSize(200,200);
		f0.setVisible(true);
	}
	public static void main(String[] args) {
		new ScPane();
	}
}

この例では、最初からスクロールバーが表示されます。
lines=10 にして、f0.setSize(200,260); くらいにすると、スクロールバーが
無い状態で始まり、窓(Frame)を小さくしてゆくとスクロールバーが現れます。

スクロールバーのON/Off や、スライダーをドラッグして
スクロールさせる処理は、ScrollPane におまかせで良いのです。

マウスのwheel にも(一応)対応しているのですが
標準ではスクロール量が(1ドット単位のようで)少なすぎます。
これを、「がっ」と大きな単位でスクロールさせるには

sp.addMouseWheelListener(new MouseWheelListener() {
	@Override
	public void mouseWheelMoved(MouseWheelEvent e) {
		int wr=e.getWheelRotation();
		Point p=sp.getScrollPosition();
		sp.setScrollPosition(0,p.y+wr*18);
	}
});

とMouseWheelListenerで処理をします。
sp.setScrollPosition(0,p.y+wr*18);の18は適当で
これを大きくすると1回のwheelでのスクロール量が大きくなります。

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)