设置 JSlider 限制
Set JSlider limits
我有一个从 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);
}
}
有一种快速肮脏的方法可以做到这一点,但这违反了一些设计原则,如 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);
}
});
}
}
我有一个从 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);
}
}
有一种快速肮脏的方法可以做到这一点,但这违反了一些设计原则,如 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);
}
});
}
}