2013-01-07 26 views
2

因此,我创建了一个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(); 
    } 
} 

回答

2

我想,如果你表现出在EventQueue#invokeLater()消息对话框中,它不应该有这个问题。如果您想在显示后取消旋转至21,只需将值重置为20之后。

+0

这最终解决了我的问题。实际上,我已经有了一个用于对话框选项的Factory类来简化代码参数,所以我很容易实现这一点。非常感谢你! – Thunderforge

+0

我已经发现,这只适用于单击向上箭头,但如果按住向上箭头,重复对话框仍然会发生。有任何想法吗? – Thunderforge

+0

检查对话框当前是否显示,如果不显示。 –

2

余可使用任一JDK 5和6上再现较早版本的Mac OS X上的使用时,会出现效果类似的效果鼠标,但不是的键盘。

  1. 当鼠标保持在微调的向上箭头按下时,出现的对话框中,在21

  2. 当鼠标稍后被释放并且第一个对话框被解除时,会出现第二个对话框。

  3. 鼠标持续的时间越长,报告的值越高,达到最大值。

对于检查您的版本,在bug report提到相关的代码参考为四个调用autoRepeatTimer.stop()private static class ArrowButtonHandlerBasicSpinnerUI找到。效果因JDK版本而异,可能是箭头在所选初始延迟内可能重复的频率的人为因素。

autoRepeatTimer.setInitialDelay(300); 
+0

我不是很了解你的答案,我会做什么来解决这个问题。有什么地方我应该叫autoRepeatTimer.setInitialDelay(300)? – Thunderforge

+0

我在JDK版本5和6上报告了我的发现。您是否看到回归?我没有看到更好的解决办法。为什么使用模态对话框报告通过阈值?我会通过一个'PropertyChangeListener'在其他地方举报[示例](http://stackoverflow.com/a/11832979/230513)。 – trashgod