Search code examples
javaswingjsliderlimits

Set JSlider limits


I have a JSlider that goes from min to max values. I want to set a range limit for slider movements.

I.e. I want to put slider limits from -90 to 90, but I want to move the slider only between -45 and 60. In this case the slider does not reach limits but it's blocked before reaching it.

How can I obtain this result?

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

Solution

  • This solution works (note the trick to let the slider think that the user released the mouse):

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