2013-10-03 42 views
1

为什么代码在JSpinner的更改事件中输入两次?JSpinner stateChanged是如何工作的?

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"); 
     } 
    }); 

上面的代码显示消息两次,当你只点击一次。

+0

您正在创建一个具有空值的模型。它甚至不应该打印一次。我确信它。 – Sage

回答

3

将生成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(); 
    } 
}); 

这不会阻止监听器被调用两次,但防止任何昂贵代码被不必要地调用

+0

是的,我认为它产生了两个事件,一个是旧的,一个是新的,但我注意到,第一次点击微调器时,听众只会被调用两次。之后它只会被调用一次。此外,它只发生在SpinnerDateModel而不是SpinnerNumberModel(基于我的测试)。 – camickr

+0

+1解决方法应适用于所有情况。 – camickr

+0

我正在测试代码并为第一次点击问题正常工作。但是,在更改微调器上的光标位置并再次单击时,我发现了同样的问题。这个问题再次出现,每次你改变旋钮上的光标 –