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

Java Swing-在EDT上运行

邓令雪
2023-03-14
问题内容

关于Swing和使用EDT进行GUI更新,我有几个问题。我刚刚开始阅读这些内容,因此我是该领域的一个完整的初学者:

  1. 在EDT上需要执行哪些操作?如果不这样做,是否只是引发了异常?
  2. 当我们实际上自动进入EDT时,是否有特定时间?
  3. 如果我们使用调度任务SwingUtilities.invokeLater,将其排队到GUI更新任务(EDT)的当前队列中,对吗?
  4. 我猜想对上述队列的访问是同步的,或者使用了一些并发的集合,但是如果我从两个后台线程安排两个GUI更新任务,则无法确定将首先添加哪个?例如,如果线程1 FIRST提交了将JLable的文本设置为“是”的任务,然后不久之后,第二个线程出现并提交了将该值设置为“否”的任务,那么我们可以保证结果将是“是”,或者仅仅是操作系统如何安排这些事情的问题?
  5. SwingWorker如何确保该done()方法在EDT上运行?它设置以下代码:
      future = new FutureTask<T>(callable) {
               @Override
               protected void done() {
                   doneEDT();
                   setState(StateValue.DONE);
               }
           };
    

所以我想知道FutureTask是否以某种方式确保invokeLater调用它?

感谢您的所有答复。


问题答案:
  1. 一个好的规则是所有操作(访问/更新/ …)都应在EDT上进行。javadoc中提到了一些例外(某些类的某些方法),但是很难记住它们,以至于坚持“在EDT上做所有事情”的方法比较容易。不会引发异常(幸运的是,JavaFX修复了此缺点)。您可以使用定制RepaintManager来检测大多数此类违规:请参阅本文。
  2. 用户触发的所有内容均在EDT上处理。例如,如果用户单击一个按钮,actionPerformed则相应的ActionActionListener将在EDT上被调用。
  3. 正确
  4. 首先安排的事情将首先执行。该invokeLater调用只是Runnable在队列末尾添加。稍候再使用invokeLater第二次,将Runnable在先前安排的时间之后添加此新内容Runnable
  5. 看一下代码 doneEDT
    private void doneEDT() {
    Runnable doDone = 
        new Runnable() {
            public void run() {
                done();
            }
        };
    if (SwingUtilities.isEventDispatchThread()) {
        doDone.run();
    } else {
        doSubmit.add(doDone);
    }
    

    }



 类似资料:
  • 问题内容: 我有一个在EDT上运行的方法,在其中我想使它在新的(非EDT)线程上执行某些操作。我当前的代码如下: 问题答案: 您可以创建并启动一个新的Java线程,该线程从EDT线程中执行您的方法:

  • EDT

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

  • 我很好奇,在放置组件时,如何使用miglaway在网格上均匀分布组件: 例如,如果我在一个按钮组中放置四个JRadioButton以跨越3行2列(2,3),然后放置三个JButton,则分布的权重是不相等的,我最终会得到以下结果: 如图所示,A和B的大小相同,C保留剩余的空间:我希望A、B、C在垂直方向上等于三分之一。 如果这在GridBagLayout中是可能的,我也可以利用它,但是我在任何一种

  • 问题内容: 我有一个正在Swing中构建的应用程序。它具有可滚动和缩放的图表组件,可以平移和缩放它。整个过程很平滑,除了有时UI会暂停约750 ms,我不知道为什么。这种情况并非总是会发生-但有时应用程序中会发生某些事情,并且每6-8秒就会开始暂停一次。 很显然,EDT上有一些事件需要花费750毫秒左右的时间才能运行,这不应该发生。 我如何特别像这样配置EDT?我真正想做的是获取在每次事件在EDT

  • 下面的代码在Eclipse中运行良好(两种图像处理方法都可以)。但是当导出为可运行的JAR文件时,双击。JAR,什么都没发生。如果我注释掉代码的图像部分,则。JAR在导出和框架构建时运行良好。因此,图像的获取似乎导致了错误。JAR可能会失败。 我有草莓。jpg文件位于“C:\Users\sean\workspace\myApps\bin\testing”中,您能否告知问题是否与我的代码有关? (此

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