概要

JSliderをマウスでクリックした場合、その位置にノブをスライド、続けてドラッグ可能にします。

サンプルコード

slider.setUI(new MetalSliderUI() {
  @Override protected TrackListener createTrackListener(JSlider slider) {
    return new TrackListener() {
      @Override public void mousePressed(MouseEvent e) {
        if (UIManager.getBoolean("Slider.onlyLeftMouseButtonDrag")
              && SwingUtilities.isLeftMouseButton(e)) {
          JSlider slider = (JSlider) e.getComponent();
          switch (slider.getOrientation()) {
          case SwingConstants.VERTICAL:
            slider.setValue(valueForYPosition(e.getY()));
            break;
          case SwingConstants.HORIZONTAL:
            slider.setValue(valueForXPosition(e.getX()));
            break;
          default:
            throw new IllegalArgumentException(
                "orientation must be one of: VERTICAL, HORIZONTAL");
          }
          super.mousePressed(e); //isDragging = true;
          super.mouseDragged(e);
        } else {
          super.mousePressed(e);
        }
      }

      @Override public boolean shouldScroll(int direction) {
        return false;
      }
    };
  }
});
View in GitHub: Java, Kotlin

解説

  • 縦左、横上のJSlider:
    • デフォルト
    • ノブを直接クリックするとドラッグ可能
    • ノブ以外の場所をクリックするとタイマーでノブの幅分だけその方向に移動
  • 縦右、横下のJSlider:
    • クリックした位置までスライドし継続してドラッグ可能
      • 目盛の間隔が広い場合、ノブがスナップされてマウスカーソルからはずれてしまい継続ドラッグがキャンセルされる場合がある

参考リンク

コメント