概要

JSliderのノブをダブルクリックして値を初期値にリセットしたり、初期値近辺でノブの吸着を実行します。

スクリーンショット

Swing/ZoomLevelsSlider.png

サンプルコード

@Override protected TrackListener createTrackListener(JSlider slider) {
  return new TrackListener() {
    @Override public void mouseClicked(MouseEvent e) {
      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) {
        e.translatePoint(trackCenter - halfThumbWidth - e.getX(), 0);
        offset = 0;
      }
      super.mouseDragged(e);
    }
  };
}
View in GitHub: Java, Kotlin

解説

  • ノブのダブルクリック
    • TrackListener#mouseClicked(MouseEvent)をオーバーライドして、ノブ領域(BasicSliderUI.thumbRect)がマウスの左ボタンでダブルクリックされたらJSliderの値を初期値にリセット
    • WindowsSliderUIで使用するWindowsTrackListenerはノブのロールオーバーを描画しているがプライベートクラスなのでこのサンプルでは使用しない
  • 初期値付近でのノブの吸着
    • TrackListener#mouseDragged(MouseEvent)をオーバーライドして、トラック領域(BasicSliderUI.trackRect)の中央付近にノブがドラッグされたらMouseEvent#translatePoint(...)メソッドでドラッグ位置を中央に移動するよう変換
  • 初期値のラベル変更

参考リンク

コメント