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