JScrollBarのトラック内でクリックした位置につまみを移動する
Total: 2250
, Today: 1
, Yesterday: 1
Posted by aterai at
Last-modified:
概要
JScrollBar
のトラック内でマウスをクリックしたときその位置につまみを移動するよう設定します。
Screenshot
Advertisement
サンプルコード
UIManager.put("ScrollBar.allowsAbsolutePositioning", Boolean.TRUE);
// ...
class AbsolutePositioningBasicScrollBarUI extends BasicScrollBarUI {
@Override protected TrackListener createTrackListener() {
return new TrackListener() {
@Override public void mousePressed(MouseEvent e) {
if (SwingUtilities.isLeftMouseButton(e)) {
super.mousePressed(new MouseEvent(
e.getComponent(), e.getID(), e.getWhen(),
InputEvent.BUTTON2_DOWN_MASK ^ InputEvent.BUTTON2_MASK,
e.getX(), e.getY(),
e.getXOnScreen(), e.getYOnScreen(),
e.getClickCount(),
e.isPopupTrigger(),
MouseEvent.BUTTON2));
} else {
super.mousePressed(e);
}
}
};
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、UIManager.put("ScrollBar.allowsAbsolutePositioning", Boolean.TRUE);
を設定してJScrollBar
のトラック内でマウスを中クリックしたときにその位置につまみを移動し、続けてドラッグ可能になるよう設定しています。
- 左:
UIManager.put("ScrollBar.allowsAbsolutePositioning", Boolean.TRUE);
を設定してマウスの中ボタンクリックの場合は、その位置までJScrollBar
のつまみ(Thumb
)を移動- 左、右ボタンはこの設定に影響しない
- 右:
UIManager.put("ScrollBar.allowsAbsolutePositioning", Boolean.TRUE);
を設定してマウスの中ボタンクリックの場合は、その位置までJScrollBar
のつまみ(Thumb
)を移動TrackListener#super.mousePressed()
メソッドをオーバーライドしたScrollBarUI
をJScrollBar
に設定し、左ボタンクリックを中ボタンクリックに変換してつまみの絶対位置移動を可能にしている- 修飾子(
modifiers
)をInputEvent.BUTTON2_DOWN_MASK ^ InputEvent.BUTTON2_MASK
、ボタン番号をMouseEvent.BUTTON2
に変更したMouseEvent
に差し替え
- 修飾子(
参考リンク
- JScrollBar - コンポーネント固有のプロパティ
- JSliderでクリックした位置にノブをスライド
JSlider
には同様のプロパティが用意されていないので、すこし複雑な処理が必要になる
- JLabelとIconで作成した検索位置表示バーをマウスで操作する
JLabel
とIcon
で作成したJScrollBar
風コンポーネントなので、デフォルトで絶対位置移動と続けてドラッグが可能