我的代码的哪一部分在事件调度队列中

Ell*_*ott 2 java swing event-handling

在我遇到这个问题之前,我以为我理解EDQ.我有如下所示的代码.它从Bufferred读取器读取.如果收到的第一个字符是"Z",我执行一组代码(显示JOptionPane),如果它是0,我执行另一段代码(显示另一个JOptionPane).我试图在EDQ中执行此操作,因此我使用SwingUtilities invokeAndWait.当我测试这些错误条件时,条件中的第一个语句按设计工作,但在测试else子句时出现java错误.特别:

线程"AWT-EventQueue-2"中的异常java.lang.Error:无法从java.awt.EventQueue.invokeAndWait(未知来源)的事件调度程序线程调用invokeAndWait

它是同一条件的所有部分.一个条款如何成为EDQ的一部分而另一个条款不是.

这太疯狂了.

谢谢你的帮助.

埃利奥特

     while ((line = in.readLine()) != null) {
        if (line.charAt(0) == 'Z') {
            String theMsg;
            theMsg = "No records were found.";
            try {
                SwingUtilities.invokeAndWait(new DoShowDialog(null, theMsg, 0));
            } catch (java.lang.reflect.InvocationTargetException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            noDocs = true;
            Object args[] = new Object[1];
            args[0] = "1";
            window.call("uploadConfig", args);
            downloadAccount.setEnabled(true);
            uploadAccount.setEnabled(false);
            deleteAllUnselectedCodes.setEnabled(false);
            queue = null;
            if (poll) {
                polltimer.restart();
            }
        } else if (line.charAt(0) == 'O') {
            String theMsg;
            theMsg = "Account is currently checked out 
            by user "+ line.substring(1)
            + ".  You can view this 
            account but you cannot modify it. ";
            try {
                SwingUtilities.invokeAndWait(new DoShowDialog(null, theMsg, 0));
            } catch (java.lang.reflect.InvocationTargetException e1) {
                e1.printStackTrace();
            } catch (InterruptedException e2) {
                // TODO Auto-generated catch block
                e2.printStackTrace();
            }
            initialckBoxState = false;
            accountfoundandnotcheckedout = true;
            viewMode = true;
            patientpane.setEditFields(false);
            otherpane.setEditFields(false);
            getAccountImages(acctEntered); // bluenoble
        }
        .....................
        more stuff
    }
Run Code Online (Sandbox Code Playgroud)

小智 5

执行不会跳转线程.

因此,所有发布的代码都在EDT(事件调度线程)中运行,并且它拒绝,invokeAndWait因为这会导致固有的死锁.(实际上,它可以像.NET中的SynchronizationContexts一样变成一个invoke-immediate,但它不是这样设计的.)

在这种特殊情况下,我怀疑代码是 EDT回调中调用的(并且从另一个场景中复制'n'pasted)."琐碎的修复"(将消除此异常)将消除invokeAndWait方法,但如果此代码也在EDT之外调用,则会产生负面影响 - 这两种情况的处理方式大不相同.花一些时间来确定此代码运行的时间/位置以及原因.

正如其他人所指出的那样,这段代码似乎很混乱:如果它不在 EDT中,那么操纵Swing对象是不好的,如果它 EDT上,则没有必要invokeAndWait和阻塞是坏的.

快乐的编码.