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

时间:2011-10-14 21:04:44

标签: java swing event-handling

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

线程“AWT-EventQueue-2”中的异常java.lang.Error:无法从事件调度程序线程调用invokeAndWait     在java.awt.EventQueue.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
    }

3 个答案:

答案 0 :(得分:5)

执行不跳线程。

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

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

正如其他人所指出的那样,这段代码似乎很混乱:如果它是 off EDT,那么操纵Swing对象是不好的,如果它是 on 那么EDT就没有了需要invokeAndWait并且阻止是不好的。

快乐的编码。

答案 1 :(得分:2)

如果最终从事件处理程序调用它,那么它将从EDT调用(除非您使用swingworkers或显式创建线程/使用线程池,否则所有代码都将被删除)

检查堆栈跟踪以找到它来自

修复它使用前面提到的SwingWorker并覆盖doInBackground(),你可以检查你是否在SwingUtilities.isEventDispatchThread()

的调度线程中

答案 2 :(得分:1)

1)theMsg看起来像疯了theMsg = "someString" + localVariable + "anotherString"

2a)为什么在基本文件I / O中调用Swing GUI

2b)为什么要在Basic File I / O中构建GUI

读取文件,关闭();终端块中的I / O流

3)你创建了很多DoShowDialog(null,theMsg,0));,每个循环创建一个,等等

4)此I / O流之外的每一个真假移动

5)如果I / O Stream

,将每个事件加载到一些Array

6)您的代码可能会冻结GUI(如果存在)

7)将所有Stream移动到BackGround任务