为什么代码在JSpinner的change事件中进入了两次?
private javax.swing.JSpinner spinner = new javax.swing.JSpinner()
spinner.setModel(new javax.swing.SpinnerDateModel());
spinner.addChangeListener(new javax.swing.event.ChangeListener() {
@Override
public void stateChanged(javax.swing.event.ChangeEvent evt) {
System.out.println("Just a test");
}
});
当你只点击一次时,上面的代码会显示两次消息。
最佳答案
生成了 2 个事件:一个用于取消选择值,另一个用于在组件中选择新值。正如@camickr 在他的评论中指出的那样,这种行为发生在 SpinnerDateModel
中,但不是在默认的 SpinnerNumberModel
作为解决方法,您可以使用
spinner.addChangeListener(new ChangeListener() {
Object lastValue;
@Override
public void stateChanged(ChangeEvent evt) {
if (lastValue != null && !spinner.getValue().equals(lastValue)) {
// expensive code calls here!
}
lastValue = spinner.getValue();
}
});
这不会阻止监听器被调用两次,但会防止不必要地调用任何昂贵的代码
关于java - JSpinner stateChanged 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19165970/