设置JSlider限制

时间:2015-08-05 14:36:35

标签: java swing 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);
  }
}

2 个答案:

答案 0 :(得分:1)

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

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);
            }
        });
    }
}

答案 1 :(得分:0)

有快速的脏方法可以做到这一点,但这违反了一些设计原则,如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);
                      }
                    }
);

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