概要

JSliderの最小・最大値とは別に、マウスドラッグによる値の変更可能範囲を制限します。

サンプルコード

class MetalDragLimitedSliderUI extends MetalSliderUI {
  @Override protected TrackListener createTrackListener(JSlider slider) {
    return new TrackListener() {
      @Override public void mouseDragged(MouseEvent e) {
        // case HORIZONTAL:
        int halfThumbWidth = thumbRect.width / 2;
        int thumbLeft = e.getX() - offset;
        int maxPos = xPositionForValue(MAXI) - halfThumbWidth;
        if (thumbLeft > maxPos) {
          e.translatePoint(maxPos + offset - e.getX(), 0);
        }
        super.mouseDragged(e);
      }
    };
  }
}
View in GitHub: Java, Kotlin

解説

上記のサンプルでは、最小値0、最大値100の目盛りを持つJSliderを作成し、その目盛りの範囲とは別に取りうる値を制限するためのリスナーを設定しています。

  • ChangeListener
    • JSliderBoundedRangeModelChangeListenerを追加し、80以上の値を指定できないように設定
    • マウスドラッグで100まで移動するとリリースした時点で80の位置まで戻る
  • TrackListener
    • 上のChangeListenerに加えてMetalSliderUI#createTrackListener(...)をオーバーライドした独自のTrackListenerを設定しマウスドラッグで80以上に移動できないように制限
    • TrackListenerMouseMotionListenerを実装しているのでmouseDragged(...)メソッドをオーバーライドして80以上へのMouseEventtranslatePoint(...)メソッドで座標変換して無効化 consume()メソッドで消費して無効化

参考リンク

コメント