• 追加された行はこの色です。
  • 削除された行はこの色です。
---
category: swing
folder: DragLimitedSlider
title: JSliderでマウスドラッグによる値の変更が可能な範囲を制限する
tags: [JSlider, MouseMotionListener]
author: aterai
pubdate: 2016-01-04T00:01:14+09:00
description: JSliderの最小・最大値とは別に、マウスドラッグによる値の変更可能範囲を制限します。
image: https://lh3.googleusercontent.com/-g2NOF6rEUgk/VokzS6_rd_I/AAAAAAAAOKc/UhGy1ZKCdpQ/s800-Ic42/DragLimitedSlider.png
hreflang:
    href: https://java-swing-tips.blogspot.com/2019/02/limit-movable-range-of-jsliders-value.html
    lang: en
---
* 概要 [#peb582b5]
JSliderの最小・最大値とは別に、マウスドラッグによる値の変更可能範囲を制限します。
* 概要 [#summary]
`JSlider`の最小・最大値とは別に、マウスドラッグによる値の変更可能範囲を制限します。

#download(https://lh3.googleusercontent.com/-g2NOF6rEUgk/VokzS6_rd_I/AAAAAAAAOKc/UhGy1ZKCdpQ/s800-Ic42/DragLimitedSlider.png)

* サンプルコード [#ad9f2214]
* サンプルコード [#sourcecode]
#code(link){{
class MetalDragLimitedSliderUI extends MetalSliderUI {
  @Override protected TrackListener createTrackListener(JSlider slider) {
    return new TrackListener() {
      @Override public void mouseDragged(MouseEvent e) {
        //case HORIZONTAL:
        // case HORIZONTAL:
        int halfThumbWidth = thumbRect.width / 2;
        int trackLength = trackRect.width;
        int trackLeft   = trackRect.x - halfThumbWidth;
        int maxPos = trackLeft + (int)(.5 + trackLength * MAXD);
        if (e.getX() > maxPos) {
          offset = 0;
          MouseEvent me = new MouseEvent(
            e.getComponent(), e.getID(), e.getWhen(), e.getModifiers(),
            maxPos, e.getY(),
            e.getXOnScreen(), e.getYOnScreen(),
            e.getClickCount(), e.isPopupTrigger(), e.getButton());
          e.consume();
          super.mouseDragged(me);
        } else {
          super.mouseDragged(e);
        int thumbLeft = e.getX() - offset;
        int maxPos = xPositionForValue(MAXI) - halfThumbWidth;
        if (thumbLeft > maxPos) {
          e.translatePoint(maxPos + offset - e.getX(), 0);
        }
        super.mouseDragged(e);
      }
    };
  }
}
}}

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

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

* 参考リンク [#n5ff3161]
- [http://stackoverflow.com/questions/34561596/how-can-i-prevent-a-jslider-from-moving-full-range java - How can I prevent a JSlider from moving full-range? - Stack Overflow]
* 参考リンク [#reference]
- [https://stackoverflow.com/questions/34561596/how-can-i-prevent-a-jslider-from-moving-full-range java - How can I prevent a JSlider from moving full-range? - Stack Overflow]

* コメント [#rf4573db]
* コメント [#comment]
#comment
#comment