java - 更改主刻度间距的第一个索引

标签 java swing jslider

我有一个 JSlider,范围为 1 到 60。我每 10 标记一次刻度,从 10 开始。我的 slider 代码如下:

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

查看代码,该行为基本上是预期的;它创建一个具有给定范围的 slider ,将值设置为 20,将主要刻度间隔为 1、11、21 等,将标签间隔为 10、20、30 等。但是,我希望主要刻度与标签为 10、20、30 等,但没有方法 setMajorTickSpacing(int space, int start)

是否有任何解决方法可以使用 setMajorTickSpacing 执行相当于 createStandardLabels(10, 10) 的操作,以便主要刻度线与标签对齐?

编辑:我的问题是刻度线,而不是标签。我希望每 1 个刻度增量创建一次刻度,主要刻度(不是标签)从 10 开始每 10 的倍数创建一次。与 Java Slider - how to make custom ticks? 不同。此刻度模式是统一的,只是不是从 slider 的最小值开始。如果我理解正确的话,setLabelTable 只允许更改标签,而不允许更改未标记的刻度。

最佳答案

我找到了一种解决方法,几乎​​可以实现我想要的功能:

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

这样, slider 的值的有效最小值仍然为 1,但从技术上讲,最小值为 0,因此主要刻度显示在正确的数字处。在我看来,这是一种丑陋的做法,但它确实为 slider 提供了我想要的行为。我会等待一段时间接受这个答案,以防有人找到更好的方法。

关于java - 更改主刻度间距的第一个索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38439871/

相关文章:

java - 带 slider 的 JPanel 不显示图形

java - 使用带有选项的分布式缓存来处理缓存未命中

java - JLabels 没有显示

java - 如何打印数组直到有值。而不是完整数组?

java - JFrame.setVisible(false) 和 Robot.createScreenCapture 时序

Java GridBagLayout 聚集在一行中

java - 在其父容器上调用 requestFocus() 后,我需要 JTextField 可编辑

java - 如何更改 JSlider 的默认/起始值

java - java中如何退出内部循环并返回到主循环?

java - 如何从 Swagger ApiModelProperty 注释生成示例 POJO?