Нечетное поведение модели SpinnerNumberModel в Java

Я пытаюсь настроить JSpinner, используя SpinnerNumberModel со значением = 0,0005, min = 0,0, max = 1,0 и размером шага = 0,0005.Однако, когда я создаю счетчик с этими параметрами, я наблюдаю очень странное поведение. Вместо того, чтобы начинать с 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 - нет?

Спасибо.

Правка: Спасибо Питеру за указание на то, что форматирование текстового поля счетчика действительно влияет на сохраненное значение. Чтобы первый счетчик работал должным образом, я добавил строку: spinner1.setEditor (new JSpinner.NumberEditor (spinner1, "0.0000")); .

5
задан David Thielke 26 December 2011 в 09:38
поделиться