Swing/ZoomLevelsSlider の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/ZoomLevelsSlider へ行く。
- Swing/ZoomLevelsSlider の差分を削除
--- category: swing folder: ZoomLevelsSlider title: JSliderのノブをダブルクリックして値を初期値にリセットする tags: [JSlider] author: aterai pubdate: 2022-04-18T00:31:55+09:00 description: JSliderのノブをダブルクリックして値を初期値にリセットしたり、初期値近辺でノブの吸着を実行します。 image: https://drive.google.com/uc?id=1UUf36GRObxKK0Insuq9_W2-OhKEIRYmH --- * 概要 [#summary] `JSlider`のノブをダブルクリックして値を初期値にリセットしたり、初期値近辺でノブの吸着を実行します。 #download(https://drive.google.com/uc?id=1UUf36GRObxKK0Insuq9_W2-OhKEIRYmH) * サンプルコード [#sourcecode] #code(link){{ @Override protected TrackListener createTrackListener(JSlider slider) { return new TrackListener() { @Override public void mouseClicked(MouseEvent e) { boolean doubleClick = SwingUtilities.isLeftMouseButton(e) && e.getClickCount() >= 2; boolean doubleClick = SwingUtilities.isLeftMouseButton(e) && e.getClickCount() >= 2; if (doubleClick && thumbRect.contains(e.getPoint())) { slider.setValue(0); } else { super.mouseClicked(e); } } @Override public void mouseDragged(MouseEvent e) { // case HORIZONTAL: int halfThumbWidth = thumbRect.width / 2; int trackLength = trackRect.width; int pos = e.getX() + halfThumbWidth; int possibleTickPos = slider.getMaximum() - slider.getMinimum(); int tickSp = Math.max(slider.getMajorTickSpacing(), 10); int tickPixels = trackLength * tickSp / possibleTickPos; int tickPixels2 = tickPixels / 2; int trackCenter = (int) trackRect.getCenterX(); if (trackCenter - tickPixels2 < pos && pos < trackCenter + tickPixels2) { if (trackCenter - tickPixels2 < pos && pos < trackCenter + tickPixels2) { e.translatePoint(trackCenter - halfThumbWidth - e.getX(), 0); offset = 0; } super.mouseDragged(e); } }; } }} * 解説 [#explanation] - ノブのダブルクリック -- `TrackListener#mouseClicked(MouseEvent)`をオーバーライドして、ノブ領域(`BasicSliderUI.thumbRect`)がマウスの左ボタンでダブルクリックされたら`JSlider`の値を初期値にリセット -- `WindowsSliderUI`で使用する`WindowsTrackListener`はノブのロールオーバーを描画しているがプライベートクラスなのでこのサンプルでは使用しない - 初期値付近でのノブの吸着 -- `TrackListener#mouseDragged(MouseEvent)`をオーバーライドして、トラック領域(`BasicSliderUI.trackRect`)の中央付近にノブがドラッグされたら`MouseEvent#translatePoint(...)`メソッドでドラッグ位置を中央に移動するよう変換 - 初期値のラベル変更 -- 各目盛りのラベルが最小値`-100`で`5%`、初期値`0`で`100%`、最大値`100`で`800%`、その他は空白文字になるよう変更 -- [[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]] * 参考リンク [#reference] - [[JSliderの目盛にアイコンや文字列を追加する>Swing/SliderLabelTable]] - [[JSliderの値を増減するJButtonを作成する>Swing/SliderWithArrowButtons]] * コメント [#comment] #comment #comment