所以我创建了一个Java应用程序,它使用JSpinner和ChangeEventListener在达到某些值时运行一些代码。达到这些特定值时,会出现JOptionPane。但随后JSpinner继续旋转。因此,如果JSpinner允许值为1-50并且我将JSpinner从20增加到21,那么当JOptionPane打开时它会一直变为50。
奇怪的是,这是Java 1.4.2中的已知错误,但据推测在5.0(Bug ID: 4840869)中得到修复。我正在运行Java 6u37。事实上,bug问题中提供的源代码(如下所示)对我来说具有完全相同的效果,就像它对bug的原始海报所做的那样。对我来说,这肯定没有得到解决。
我能想到的唯一可能是为什么这可能是我运行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();
}
}
答案 0 :(得分:2)
我可以在早期版本的Mac OS X上使用JDK 5和6重现类似的效果。使用鼠标时会出现这种效果,但不键盘。
当鼠标按住微调器的向上箭头时,对话框显示在21
。
稍后释放鼠标并取消第一个对话框时,会出现第二个对话框。
鼠标保持的时间越长,报告的值就越高,达到最大值。
为了参考检查您的版本,bug report中提到的相关代码是autoRepeatTimer.stop()
中private static class ArrowButtonHandler
中BasicSpinnerUI
的{{1}}四次调用。效果因JDK版本而异,可能是箭头在所选初始延迟内重复的频率。
autoRepeatTimer.setInitialDelay(300);
答案 1 :(得分:2)
我认为如果您在EventQueue#invokeLater()
中显示消息对话框,则不应该出现此问题。如果您想在显示后取消旋转到21,只需将值重置为20。