我有一个问题,从我的previous problem关注。我在代码库的其他地方也有代码SwingUtillities.invokeAndWait,但是当我删除它时,gui不会刷新。如果我不删除它,我得到的错误是:
Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
at java.awt.EventQueue.invokeAndWait(Unknown Source)
at javax.swing.SwingUtilities.invokeAndWait(Unknown Source)
at game.player.humanplayer.model.HumanPlayer.act(HumanPlayer.java:69)HumanPlayer.act中的代码是:
public Action act(final Action[] availiableActions) {
try {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
gui.update(availiableActions);
}
});
}
catch (InterruptedException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
synchronized(performedAction){
while(!hasPerformedAction()){
try {
performedAction.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
setPerformedAction(false);
}
return getActionPerfomed();
}调试时的线程图像,因为屏幕不会绘制:alt text http://img684.imageshack.us/img684/6669/69288941.png
堆栈的文本版本:
ui.startup.LoginScreen at localhost:51050
-> Deamon Thread [AWT-Windows] (Running)
-> Thread [AWT-Shutdown] (Running)
-> Thread [AWT-EventQueue-0] (Running)
-> Thread [DestroyJavaVM] (Running)发布于 2010-03-13 06:02:43
答案是不打这个电话
new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState);在EDT中,让它在一个新的(非EDT)线程上执行,这样以后调用invokeAndWait时,它就可以像运行该命令的线程一样正确地运行。修订后的守则如下:
Thread t = new Thread(new Runnable() {
@Override
public void run() {
new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState);
}
});
t.start();发布于 2010-03-13 03:52:36
invokeAndWait()是从非图形用户界面线程调用的。它将一个Runnable对象发送到将在其中执行它的GUI线程。
从GUI线程向其自身发送Runnable对象是没有意义的。它与直接在Runnable对象上调用run()具有相同的效果。
发布于 2017-03-20 03:48:11
您可以在之前检查您当前的调用线程是否已经是事件分派器:
private void syncExec(final Runnable r) {
try {
if (EventQueue.isDispatchThread()) r.run();
else EventQueue.invokeAndWait(r);
} catch (final Exception e) {
Throws.throwRuntime(e);
}
}请注意,SwingUtilities.invokeAndWait(Runnable)只是委托给EventQueue。
https://stackoverflow.com/questions/2435397
复制相似问题