繁体   English   中英

当JOptionPane显示在ChangeListener上时,JSpinner保持旋转

[英]JSpinner keeps spinning while JOptionPane is shown on ChangeListener

因此,我创建了一个Java应用程序,该应用程序使用JSpinner和ChangeEventListener在达到某些值时运行一些代码。 当达到这些特定值时,将出现一个JOptionPane。 但是后来JSpinner不断旋转。 因此,如果JSpinner允许值为1-50,而我将JSpinner从20增加到21,则在JOptionPane打开时,它会一直上升到50。

奇怪的是,这是Java 1.4.2中的一个已知错误,但据说已在5.0中修复( 错误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();
    }
}

我可以在早期版本的Mac OS X上使用JDK 5和6来重现类似的效果。使用鼠标而不是键盘时会出现这种效果。

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

  2. 稍后释放鼠标并关闭第一个对话框时,将显示第二个对话框。

  3. 按住鼠标的时间越长,报告的值越高,直到最大值。

对于在检查你的版本参考,在提到相关的代码错误报告为四调用autoRepeatTimer.stop()private static class ArrowButtonHandler中发现的BasicSpinnerUI 效果因JDK版本而异,可能是箭头在选定的初始延迟内可以重复的频率的影响。

autoRepeatTimer.setInitialDelay(300);

我认为,如果您在EventQueue#invokeLater()显示消息对话框,则应该没有此问题。 如果要在显示后取消旋转到21,只需将其重置为20。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM