我有一个JSlider
,范围是1到60.我有10个标记,从10开始。我的滑块代码是:
JSlider slider = new JSlider(1, 60);
slider.setValue(20);
slider.setMajorTickSpacing(10);
slider.setMinorTickSpacing(1);
slider.setLabelTable(slider.createStandardLabels(10, 10));
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
行为基本上是预期的,查看代码;它创建一个具有给定范围的滑块,将值设置为20,将主要刻度位置设置为1,11,21等,标签位于10,20,30等。但是,我希望主要刻度线与标签为10,20,30等,但没有方法setMajorTickSpacing(int spacing, int start)
。
是否有任何解决方法可以使用createStandardLabels(10, 10)
执行与setMajorTickSpacing
相同的操作,以便主要标记与标签对齐?
编辑:我的问题是刻度线,而不是标签。我希望每10个滴答创建一个滴答,主要滴答(不是标签)从10开始每10个创建一次。不像Java Slider - how to make custom ticks?这个刻度模式是统一,根本不是从滑块的最小值开始。如果我理解正确,setLabelTable
只允许更改标签,而不是未标记的刻度。
答案 0 :(得分:0)
我找到了一种解决方法,它允许我想要的功能:
JSlider slider = new JSlider(0, 60); //minimum=0 so major ticks appear on multiples of 10
slider.setValue(20);
slider.setMajorTickSpacing(10);
slider.setMinorTickSpacing(1);
slider.setLabelTable(slider.createStandardLabels(10, 10));
slider.setPaintLabels(true);
slider.setPaintTicks(true);
slider.setSnapToTicks(true);
//If the slider is set to 0, reset it to 1
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
if (((JSlider) e.getSource()).getValue() == 0)
((JSlider) e.getSource()).setValue(1);
}
});
这样,滑块的值仍然具有有效最小值1,但技术上最小值为0,因此主要刻度出现在正确的数字处。在我看来,这是一种丑陋的做法,但它确实给了滑块我想要的行为。我会等待接受这个作为答案的一段时间,以防万一有人确实找到了更好的方法。