Java 这是JSlider中的一个bug吗?
我在使用这个类时遇到了一些问题,特别是在使用记号标签时 第一次使用Java 这是JSlider中的一个bug吗?,java,swing,user-interface,jslider,Java,Swing,User Interface,Jslider,我在使用这个类时遇到了一些问题,特别是在使用记号标签时 第一次使用setMajorTickSpacing和setMinorTickSpacing时,一切正常。但是,对setMajorTickSpacing的后续调用会更新刻度,但不会更新标签。我写了一个简单的例子来说明这种行为: import java.awt.event.*; import javax.swing.*; public class SliderTest { public static void main(String a
setMajorTickSpacing
和setMinorTickSpacing
时,一切正常。但是,对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);
}
}
在第二次调用setMajorTickSpacing
之前,使用slider.setLabelTable(null)
或slider.setLabelTable(slider.createStandardLabels(25))
两种简单的解决方法似乎可以解决问题。鉴于此,标签表似乎没有正确更新
我不确定这是不是有意的行为。我的第一个直觉是,更新记号间距也应该更新标签,但也有将两者分开的理由
所以我想知道它是什么-这是
JSlider
中的错误还是预期的行为?如果是预期的行为,那么做出选择的突出原因是什么?通过查看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.