8

我在使用JSlider类时遇到了一些问题——特别是使用刻度标签。

我第一次使用setMajorTickSpacingsetMinorTickSpacing一切都按预期工作。但是,后续调用setMajorTickSpacing更新刻度,而不是标签。我写了一个简单的例子来演示这种行为:

import java.awt.event.*;
import javax.swing.*;

public class SliderTest {
    public static void main(String args[]) {
        JFrame frame = new JFrame();
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent we) {
                System.exit(0);
            }
        });
        frame.setSize(300, 250);

        JSlider slider = new JSlider(0, 100, 0);
        slider.setMajorTickSpacing(10);
        slider.setMinorTickSpacing(1);
        slider.setPaintLabels(true);
        slider.setPaintTicks(true);

        slider.setMajorTickSpacing(25);
        slider.setMinorTickSpacing(5);

        frame.add(slider);
        frame.pack();
        frame.setVisible(true);
    }
}

两个简单的解决方法似乎可以解决问题 - 使用slider.setLabelTable(null)slider.setLabelTable(slider.createStandardLabels(25))在第二次调用setMajorTickSpacing. 鉴于此,标签表似乎没有正确更新。

我不确定这是否是预期的行为。我的第一直觉是更新刻度间距也应该更新标签,但也有将两者分开的论点。

所以我想知道它是什么 - 这是一个错误JSlider还是预期的行为?如果这预期的行为,那么做出该选择的突出原因是什么?

4

1 回答 1

5

setMajorTickSpacing您可以通过查看源代码轻松查看此问题的原因:

public void setMajorTickSpacing(int n) {
    int oldValue = majorTickSpacing;
    majorTickSpacing = n;
    if ( labelTable == null && getMajorTickSpacing() > 0 && getPaintLabels() ) {
        setLabelTable( createStandardLabels( getMajorTickSpacing() ) );
    }
    firePropertyChange("majorTickSpacing", oldValue, majorTickSpacing);
    if (majorTickSpacing != oldValue && getPaintTicks()) {
        repaint();
    }
}

如果您两次调用此方法 -labelTable值将不再为 null 并且不会更新。根据方法的评论,这可能是预期的行为:

 * This method will also set up a label table for you.
 * If there is not already a label table, and the major tick spacing is
 * {@code > 0}, and {@code getPaintLabels} returns
 * {@code true}, a standard label table will be generated (by calling
 * {@code createStandardLabels}) with labels at the major tick marks.

因此,每次要更新标签时,您都必须手动更新标签(除非您使用自己的更新方法覆盖此方法)。

于 2012-09-24T10:53:05.873 回答