っかちさんを満足させるスクロールの速いペインを作りたい,の巻
2001.02.25 新規

例えば、幅の広いパネルやログを表示させるようなテキスト・エリアでは

getContentPane().add(new JScrollPane(routePanel),BorderLayout.CENTER);

JScrollPane sc=new JScrollPane(textArea
    ,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS
    ,JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
getContentPane().add(sc,BorderLayout.SOUTH);
なんていう感じで、JScrollPane クラスを使います。

この JScrollPane クラス、スクロール・バーを常に表示させたり必要なときだけ表示させたりと非常に便利。 何より勝手に管理してくれているので、ホントに楽チン。

ただ、こんなに使い勝手の良いクラスにも、1つだけ使っているうちに我慢できなくなる問題があります。 それが、スクロールの遅さ。

スクロール・バー内にあるバーを直接ドラッグしたり、バーのないトコでクリックしてバーを移動させたときは、問題のない快適なスクロールを得られます。 ただしスクロール・バー上下にある「▲」ボタンや「▼」ボタンを使用した場合には、「さっきまでの快適さはドコに?」というようなノロマなスクロールになってしまいます。
まぁ、使わなければ良いと言ってしまえばソコまでですが、せっかく付いているボタンです。 なんとかして、快適なスクロールを提供してくれるように変更してみましょう。

ボタンでのスクロールが快適と思えないのは、1回にスクロールする移動量が問題となってます。 と、そこまでわかったのなら、解決まではスグです。 その1回分の移動量を設定しなおすことで、スクロール幅が大きくなり、快適と思える挙動になります。
スクロール・バーの設定は、当然 JScrollPane クラスでは扱えません。 なので、JScrollPane#getVerticalScrollBar() メソッドを用いて保持している JScrollBar クラスを取り出します。

sc.getVerticalScrollBar().setUnitIncrement(10);
上記のように JScrollBar#setUnitIncrement() メソッドで移動量(増加量)を設定することで、期待している動作が得られます。

なお、JScrollPane クラスは縦と横で違うスクロール・バーを保持しています。 先の例は縦スクロール・バーの場合なので、横スクロール・バーの挙動を変えるときには JScrollPane#getHorizontalScrollBar() メソッドを使用します。


戻る