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和阻塞是坏的.
快乐的编码.