所以我创建了一个 Java 应用程序,它使用 JSpinner 和 ChangeEventListener 在达到某些值时运行一些代码。当达到这些特定值时,会出现一个 JOptionPane。但随后 JSpinner 继续旋转。因此,如果 JSpinner 允许值 1-50,并且我将 JSpinner 从 20 增加到 21,则在 JOptionPane 打开时它会一直增加到 50。
奇怪的是,这是 Java 1.4.2 中的一个已知错误,但据说在 5.0 中已修复(错误 ID:4840869)。我正在运行 Java 6u37。事实上,错误问题中提供的源代码(如下所示)对我来说与它对错误的原始海报所做的效果完全相同。它肯定没有为我修好。
我唯一能想到的可能是我正在运行 Mac OS 10.7.5,并且错误修复可能没有以某种方式进入我的版本。我能做些什么来防止这种行为发生吗?
演示这一点的源代码(最初来自错误报告):
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class SpinnerFrame extends JFrame implements ChangeListener {
private JSpinner spinner;
private boolean changing;
private SpinnerFrame() {
super();
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(getSpinner());
setSize(80,60);
setLocation(200, 300);
setVisible(true);
changing = false;
}
private JSpinner getSpinner() {
if (spinner == null) {
spinner = new JSpinner();
spinner.setModel(new SpinnerNumberModel(10, 1, 50, 1));
spinner.addChangeListener(this);
}
return spinner;
}
public void stateChanged(ChangeEvent e) {
JSpinner spinner = (JSpinner) e.getSource();
int value = ((Integer) spinner.getValue()).intValue();
System.out.println("Changed to " + value);
if (changing) {
return;
}
changing = true;
if (value > 20) {
JOptionPane.showMessageDialog(this, "20 exceeded");
//While this is up, the JSpinner continues to 50
}
changing = false;
}
public static void main(String[] args) {
new SpinnerFrame();
}
}