JScrollPaneとwheelスクロール
JavaのGUIには、AWT と Swing (や SWT) などがあります。
AWT と Swing は似ているものもあれば、ちょっと違うものもあり
AWT で書いたものを Swing にするのは、ちょっと面倒だったります。
毎度、管理人イガジーです。
5日ほど前に ScrollPane と マウスwheelでのスクロールというエントリを書きましたが
これを JScrollPane にしてみました。
AWT だと、ScrollPane.add(Component); なのが
Swing では、JScrollPane jsp = new JScrollPane(Component); と
new する時に指定します。
この程度であれば簡単なのですが、MouseWheell の スクロール幅を
変える(大きくする)のが、ちょっと手間でした。
AWT の ScrollPane sp であれば
sp.addMouseWheelListener(new MouseWheelListener() {
@Override
public void mouseWheelMoved(MouseWheelEvent e) {
int wr=e.getWheelRotation();
Point p=sp.getScrollPosition();
sp.setScrollPosition(0,p.y+wr*20);
}
});
なのですが、Swing の JScrollPane jsp では
一旦、JViewPort なるものを経由する必要があるようです。
また、下(?)にスクロールさせるとComponetが存在しないところまで
スクロールしてしまうようです。
上(?)にスクロールさせた時は Componetの下端で止まりますが、
チラつきます(描画しなおしが発生するようです)。
対策を入れた例は次のような感じかと思います。
p0というのは、JScrollPane に組み込んでいる JPanel です。
jsp.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent e) {
Rectangle spbb=jsp.getViewportBorderBounds();
Dimension p0sz=p0.getSize();
JViewport vp=jsp.getViewport();
Point pp=vp.getViewPosition();
pp.y+=e.getWheelRotation()*20;
if (pp.y<0) pp.y=0;
int maxy=p0sz.height-spbb.height;
if (pp.y>maxy) pp.y=maxy;
vp.setViewPosition(pp);
jsp.setViewport(vp);
}
});
これだけだと分かりにくいかもしれませんね。
ご質問、ご要望などございましたら、メールフォームからお寄せください。
この記事へのコメントはこちら