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);
	}
});

これだけだと分かりにくいかもしれませんね。
ご質問、ご要望などございましたら、メールフォームからお寄せください。

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

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

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

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