Swing/DragLimitedSlider のバックアップの現在との差分(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- バックアップ を表示
- Swing/DragLimitedSlider へ行く。
- 追加された行はこの色です。
- 削除された行はこの色です。
--- 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