当前位置: 首页 > 面试题库 >

从EDT调用invokeAndWait

养淇
2023-03-14
问题内容

我以前的问题有一个问题。我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();
 }

在屏幕调试时无法绘制线程图像:
替代文本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)

问题答案:

答案不是打电话

new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState);

从EDT中使它在新的(非EDT)线程上执行,以便稍后invokeAndWait调用它时,它的功能与运行该命令的线程不是EDT一样正确。修改后的代码如下:

Thread t = new Thread(new Runnable() {
    @Override
    public void run() {
       new GameInitializer(userName, player, Constants.BLIND_STRUCTURE_FILES.get(blindStructure), handState);       
    }

   });
t.start();


 类似资料:
  • EDT

    EGL 语言是由 IBM 提供的一门面向业务开发的语言。由于它简单易用,具有跨语言、跨平台的特性,目前全球众多大型企业和机构已采用 EGL 来开发他们最核心、最重要的应用程序。 为了更大限度地发挥 EGL 的功能,也为了吸引更多的 EGL 开发者,从 2008 年开始,IBM 着手开始将 EGL 进行开源。2011 年 12 月,EGL 的开源版本 EDT(全称是 EGL Development

  • 问题内容: 如何知道被阻塞(不是视觉上而是通过检查线程本身)?有办法吗? 我正要去完成大学的最后一项毕业任务,该任务有很多图表,但是对Swing EDT(一般来说是Java)了解很少。 看一下这块: 如果我们执行一些修改块上gui组件的任务(包括调用另一个Thread),那已经是正确的方法了吗? 而且由于EDT是单线程环境,除了直接在GUI内部调用之外,还有其他(至少)一个阻止EDT的部分/示例。

  • 问题内容: 我正在使用一个称为类的类,该类可实现处理项目中的正常异常。 据我了解,此类无法捕获EDT异常,因此我尝试在该方法中使用此类来处理EDT异常: 但是直到现在,它仍无法正常工作。例如,在初始化JFrame时,我从构造器中的捆绑文件中加载其标签,如下所示: 我从捆绑文件中删除了密钥以测试异常处理程序,但是它没有用!异常通常打印在日志中。 我在这里做错什么了吗? 问题答案: EDT异常处理程序

  • 问题内容: 正如我在较早的文章中与Inerdia讨论的那样, 当我在某些JPanel中(肯定是EDT- 我已通过方法check进行检查)时,仍然有些奇怪,然后我调用了一些动画线程(该线程扩展Thread)以在内部启动通过检查我不在EDT上的线程。 所以我想我应该是因为动画应该在EDT上,所以我用runnable和invokeAndWait()包装了animate方法,但是仍然在动画线程中得到了我不

  • 问题内容: 我找不到任何官方文档说可以安全地从事件调度线程EDT之外的另一个线程进行调用。 是这样吗 在哪里可以找到一些文档/代码? 问题答案: 这是官方网页上的一句话: 下面的JComponent方法是安全的,从任何线程调用: ,,和。该和方法队列事件派发线程请求调用和分别。 编辑1: 由于前面提到的链接已转移。我正在发布一个新链接,尽管实际上可能需要花费更多时间才能真正知道此页面的真实性,因为

  • 当我在AWS平衡器下部署我的应用程序时,应用程序会从myDir/myAppName调用一些资源。但是样式资源是从根调用的,比如myDir/。 例如myDir/myAppName/index.html可用于loadBalancer.但是myDir/myStilesheet.css不可访问。 如何在myDir/myAppName下设置这些资源(css等)? 提前谢谢!