有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java这是JSlider中的一个bug吗?

我在使用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);
    }
}

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

我不确定这是不是有意的行为。我的第一个直觉是,更新记号间距也应该更新标签,但也有将两者分开的理由

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


共 (1) 个答案

  1. # 1 楼答案

    通过查看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.
    

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