我有一个从min
到max
值的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);
}
}
答案 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);
}
}
);
在此解决方案中,如果用户试图拖动拇指系统将允许超出限制,但一旦用户释放鼠标,它将设置为限制。