SwingのJTableで、スクロールバーの矢印ボタン押下によるスクロールを、矢印ボタンを押さずにプログラムで再現する。
(2008/07/30 22:21)

表題の件につきまして、やりたかったことというのは、JTable ( 実際には JScrollPane )のスクロールバーの 矢印ボタンを押した際のスクロール動作を、別のコントロールからのイベントをトリガとして行いたい、ということでした。

# 「矢印ボタン」…下の図でいうところの「buttons」

スクロールバーの図 (http://java.sun.com/docs/books/tutorial/uiswing/components/scrollpane.htmlから借用)

で、結論といたしましては、これを実現するプログラムは非常に単純明快で、ハマる要素がゼロだったのですが、残念ながら、わたくし半日ほどハマりましたので、ここに最終的な成果を記録しておきます。

手順は以下のとおり。

  1. スクロールさせたい JTable を含む JScrollPane から、スクロールさせたい方向の JScrollBar を取得する。
    JScrollPane#getHorizontalScrollBar() または getVerticalScrollBar() を使用する。
  2. JScrollBar#getUnitIncrement(int direction)で、矢印ボタンが押下された場合の増分値を取得する。
    ※引数のdirectionはスクロールの方向で、+1-1
  3. JScrollBar#getValue() で取得した値に、上記 2. で取得した増分値と direction の積を加算し、その結果を JScrollBar#setValue(int) する。
  4. おわり。

…たったこれだけのことを突き止めるのに、動作検証用のサンプルプログラムを作成する羽目になりました。

せっかくだから、俺はこのサンプルプログラムをさらすぜ!(誰?)


動作説明。

Java 1.4 以降で動作します。JTable の上にある4つのボタンをそれぞれ押すと、それぞれの方向に JTable の内容物がスクロールします。

スクロールする量は、対応するスクロールバーの矢印ボタンを押下した場合と同じはずです。

Java 1.4 で確認したところ 微妙に中途半端なスクロール幅でしたが、Java 1.6 ではきれいにセル単位でスクロールしました。※ Java 1.4 では、そもそも矢印ボタンを押下したときも中途半端にスクロールします。


おまけ機能。

通常、垂直および水平のスクロールバーが両方有効になっている場合、マウスのホイールを転がすと、垂直方向にスクロールします(垂直優先)。で、そういう状況下でもホイールだけで水平方向にもスクロールできたら便利じゃないかなということで、今回のサンプルでは、列ヘッダ(JTableHeader)上でマウスのホイールを転がすと、水平方向にスクロールするようにしてみました。

【 permanent-link | java swing jtable | トラックバック(0) | コメント(0) | page top↑| edit
<<vistaのエクスプローラで、同じドライブ内でのフォルダの移動が遅くてたまらん人のための代案。 | ホーム | NetBeans 6(6.1)の「名前を変更」リファクタリングがデザイン画面の自動生成コードにも対応していて感激した。>>
コメント
コメントの投稿














管理者にだけ表示を許可する

トラックバック
トラックバックURL
→http://0xc000013a.blog96.fc2.com/tb.php/44-178311fd
この記事にトラックバックする(FC2ブログユーザー)
| ホーム |