因此,我创建了一个Java应用程序,该应用程序使用JSpinner和ChangeEventListener在达到特定值时运行一些代码。当达到某些值时,会出现一个JOptionPane。但随后JSpinner继续旋转。因此,如果JSpinner允许值为1-50,并且我已将JSpinner从20增加到21,则在JOptionPane打开时它会一直保持到50。JSpinner继续旋转,而JOptionPane显示在ChangeListener上
奇怪的是,这是Java 1.4.2中的一个已知错误,但据推测固定在5.0(Bug 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();
}
}
这最终解决了我的问题。实际上,我已经有了一个用于对话框选项的Factory类来简化代码参数,所以我很容易实现这一点。非常感谢你! – Thunderforge
我已经发现,这只适用于单击向上箭头,但如果按住向上箭头,重复对话框仍然会发生。有任何想法吗? – Thunderforge
检查对话框当前是否显示,如果不显示。 –