在我遇到这个问题之前,我以为我理解了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
}
答案 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
,将每个事件加载到一些Array6)您的代码可能会冻结GUI(如果存在)
7)将所有Stream移动到BackGround任务