概要

JScrollBarからBoundedRangeModelを取得し、JLabelIconで表示した検索位置表示バーをマウスで操作可能にします。

サンプルコード

class HighlightBarHandler extends MouseAdapter {
  private void processMouseEvent(MouseEvent e) {
    Point pt = e.getPoint();
    Component c = e.getComponent();
    BoundedRangeModel m = scrollbar.getModel();
    int h = m.getMaximum() - m.getMinimum();
    int iv = (int) (.5 - m.getExtent() * .5 + pt.y * h / (double) c.getHeight());
    m.setValue(iv);
  }

  @Override public void mousePressed(MouseEvent e) {
    processMouseEvent(e);
  }

  @Override public void mouseDragged(MouseEvent e) {
    processMouseEvent(e);
  }
}
View in GitHub: Java, Kotlin

解説

  • Iconに検索結果をハイライト表示しJLabel#setIcon(...)で設定
    • このJLabelJScrollPaneの子コンポーネントではないので縦JScrollBarBoundedRangeModelChangeListenerを追加して更新ごとにJLabel#repaint()を実行して再描画する必要がある
  • JLabel上の表示範囲をマウスで操作可能にするためMouseListenerなどを追加
    • 位置はJScrollBarからBoundedRangeModelを取得して計算する

参考リンク

コメント