Я пытаюсь настроить 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"));
.