设置 JSlider 限制

Set JSlider limits

我有一个从 minmax 值的 JSlider。我想设置滑块移动的范围限制。

即我想将滑块限制从 -90 到 90,但我只想在 -45 到 60 之间移动滑块。在这种情况下,滑块没有达到限制,但在到达之前被阻止了。

我怎样才能得到这个结果?

import java.awt.BorderLayout;

import javax.swing.BoundedRangeModel;
import javax.swing.JFrame;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class TickSlidersSnapToTicks {
  public static void main(String args[]) {
    JFrame frame = new JFrame("Tick Slider");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JSlider slider = new JSlider(-90, 90, 0);

    // Major Tick 25 - Minor 5
    jSliderOne.setMinorTickSpacing(5);
    jSliderOne.setMajorTickSpacing(25);
    jSliderOne.setPaintTicks(true);

    // I want to put here slider block limits
    // ...

    frame.add(jSliderOne, BorderLayout.NORTH);
    frame.setSize(300, 200);
    frame.setVisible(true);
  }
}

有一种快速肮脏的方法可以做到这一点,但这违反了一些设计原则,如 LSP。

    JSlider jSliderOne = new JSlider();

    // Major Tick 25 - Minor 5
    jSliderOne.setMinorTickSpacing(5);
    jSliderOne.setMajorTickSpacing(25);
    jSliderOne.setPaintTicks(true);
    jSliderOne.setModel(new DefaultBoundedRangeModel()
                    {
                      @Override
                      public void setValue(int n)
                      {
                        if (n > 50)
                        {
                          n = 50;
                        }
                        else if (n < -45)
                        {
                          n = -45;
                        }

                        super.setValue(n);
                      }
                    }
);

在此解决方案中,如果用户尝试拖动拇指,系统将允许超出限制,但一旦用户释放鼠标,它将设置为限制。

这个解决方案有效(注意让滑块认为用户释放了鼠标的技巧):

public class InnerSlider extends JSlider {

    int innerMin, innerMax;

    public InnerSlider(int min, int max, int innerMin, int innerMax){
        super(min,max);
        this.innerMin = innerMin;
        this.innerMax= innerMax;
        addChangeListener((e) -> {
            if(getValue() < innerMin){
                setValue(innerMin);
                getMouseListeners()[0].mouseReleased(null);
            }else if(getValue() > innerMax){
                setValue(innerMax);
                getMouseListeners()[0].mouseReleased(null);
            }
        });
    }
}