更改主要刻度线间距的第一个索引

时间:2016-07-18 14:53:58

标签: java swing jslider

我有一个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只允许更改标签,而不是未标记的刻度。

1 个答案:

答案 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,因此主要刻度出现在正确的数字处。在我看来,这是一种丑陋的做法,但它确实给了滑块我想要的行为。我会等待接受这个作为答案的一段时间,以防万一有人确实找到了更好的方法。