首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从EDT调用invokeAndWait

从EDT调用invokeAndWait
EN

Stack Overflow用户
提问于 2010-03-13 03:49:25
回答 5查看 17.6K关注 0票数 8

我有一个问题,从我的previous problem关注。我在代码库的其他地方也有代码SwingUtillities.invokeAndWait,但是当我删除它时,gui不会刷新。如果我不删除它,我得到的错误是:

代码语言:javascript
复制
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中的代码是:

代码语言:javascript
复制
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

堆栈的文本版本:

代码语言:javascript
复制
ui.startup.LoginScreen at localhost:51050
 -> Deamon Thread [AWT-Windows] (Running)
 -> Thread [AWT-Shutdown] (Running)
 -> Thread [AWT-EventQueue-0] (Running)
 -> Thread [DestroyJavaVM] (Running)
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-13 06:02:43

答案是不打这个电话

代码语言:javascript
复制
new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState);

在EDT中,让它在一个新的(非EDT)线程上执行,这样以后调用invokeAndWait时,它就可以像运行该命令的线程一样正确地运行。修订后的守则如下:

代码语言:javascript
复制
Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
       new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState);       
    }

   });
t.start();
票数 10
EN

Stack Overflow用户

发布于 2010-03-13 03:52:36

invokeAndWait()是从非图形用户界面线程调用的。它将一个Runnable对象发送到将在其中执行它的GUI线程。

从GUI线程向其自身发送Runnable对象是没有意义的。它与直接在Runnable对象上调用run()具有相同的效果。

票数 5
EN

Stack Overflow用户

发布于 2017-03-20 03:48:11

您可以在之前检查您当前的调用线程是否已经是事件分派器:

代码语言:javascript
复制
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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2435397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档