5

値 = 0.0005、最小 = 0.0、最大 = 1.0、ステップ サイズ = 0.0005 の SpinnerNumberModel を使用して JSpinner をセットアップしようとしています。ただし、これらのパラメーターを使用してスピナーを作成すると、非常に奇妙な動作が見られます。0.0005 から開始し、上向き矢印をクリックするたびに 0.0005 ずつ増加するのではなく、値が 0 に固定されているように見えます。

これが単なるフォーマットの問題ではないことを確認するために、各変更イベントの後にスピナーの値を出力しました。確かに、上矢印をクリックするたびに、スピナーがクリックされた回数に関係なく、コンソールには値が 0 として表示され、次に 0.0005 として表示されます。

以下は、これをテストするために使用したコードです。値がわずかに異なるスピナーは、比較目的で問題なく動作します。

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

public class Main {

    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(200, 80);
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005));
        final JSpinner spinner2 = new JSpinner(new SpinnerNumberModel(0.05, 0.0, 1.0, 0.05));
        panel.add(spinner1, BorderLayout.NORTH);
        panel.add(spinner2, BorderLayout.SOUTH);
        frame.add(panel);
        spinner1.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                System.out.println("spinner1: " + ((Number) spinner1.getValue()).doubleValue());
            }
        });
        spinner2.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                System.out.println("spinner2: " + ((Number) spinner2.getValue()).doubleValue());
            }
        });
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}

spinner2 が意図したとおりに機能するのに、spinner1 が機能しない理由を誰かに説明してもらえますか?

ありがとう。

編集:スピナーのテキストフィールドのフォーマットが実際に保存された値に影響を与えることを指摘してくれたPeterに感謝します。最初のスピナーを意図したとおりに動作させるために、次の行を追加しました: spinner1.setEditor(new JSpinner.NumberEditor(spinner1, "0.0000"));.

4

1 に答える 1

9

問題は、スピナーが使用する JFormattedTextField にあります。そのエディタには次のものがあります。

public void commitEdit() throws ParseException {
    AbstractFormatter format = getFormatter();

    if (format != null) {
        setValue(format.stringToValue(getText()), false, true);
    }
}

スピナーは0.0005を0.0として表示します。最初にモデルに0.0を入れてから0.0005にインクリメントすると、イベントは実際にそれをキャプチャしますが、テキストフィールドには0.0しか表示されません

解決策は、スピナーテキストフィールドのフォーマットを変更することです。

エディターをオーバーライドできます

final JSpinner spinner1 = new JSpinner(new SpinnerNumberModel(0.0005, 0.0, 1.0, 0.0005)) {
      @Override
      protected JComponent createEditor( SpinnerModel model )
      {
        return new NumberEditor(this, "0.0000");//needed decimal format
      }
    };
于 2011-12-26T09:29:50.963 に答える