Swing/DragLimitedSlider のバックアップの現在との差分(No.2)
-
category: swing
folder: DragLimitedSlider
title: JSliderでマウスドラッグによる値の変更が可能な範囲を制限する
tags: [JSlider, MouseMotionListener]
author: aterai
pubdate: 2016-01-04T00:01:14+09:00
description: JSliderの最小・最大値とは別に、マウスドラッグによる値の変更可能範囲を制限します。
image:
hreflang:
href: https://java-swing-tips.blogspot.com/2019/02/limit-movable-range-of-jsliders-value.html lang: en
概要
JSliderの最小・最大値とは別に、マウスドラッグによる値の変更可能範囲を制限します。概要
JSlider
の最小・最大値とは別に、マウスドラッグによる値の変更可能範囲を制限します。
Screenshot
Advertisement
サンプルコード
サンプルコード
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 thumbLeft = e.getX() - offset;
int maxPos = xPositionForValue(MAXI) - halfThumbWidth;
if (thumbLeft > maxPos) {
int x = maxPos + offset;
MouseEvent me = new MouseEvent(
e.getComponent(), e.getID(), e.getWhen(), e.getModifiers(),
x, e.getY(),
e.getXOnScreen(), e.getYOnScreen(),
e.getClickCount(), e.isPopupTrigger(), e.getButton());
e.consume();
super.mouseDragged(me);
} else {
super.mouseDragged(e);
e.translatePoint(maxPos + offset - e.getX(), 0);
}
super.mouseDragged(e);
}
};
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、最小値0
、最大値100
の目盛りを持つJSlider
を作成し、その目盛りの範囲とは別に、取りうる値を制限するようにリスナーを設定しています。
解説
上記のサンプルでは、最小値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()
メソッドで消費して無効化
- 上の