8

JSliderクラス、特に目盛りラベルの使用で問題が発生しています。

初めて使用する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);
    }
}

2つの簡単な回避策で問題が解決するようです。2回目の呼び出しを使用するslider.setLabelTable(null)か、その前に。これを考えると、ラベルテーブルが正しく更新されていないように見えます。slider.setLabelTable(slider.createStandardLabels(25))setMajorTickSpacing

これが意図した動作であるかどうかはわかりません。私の最初の本能は、目盛りの間隔を更新するとラベルも更新されるはずですが、2つを分離するための引数もあります。

だから私はそれがどれであるか知りたいです-これはバグですか、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();
    }
}

このメソッドを2回呼び出すと、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 に答える