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でのスクロール量が大きくなります。
この記事へのコメントはこちら