首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >invokeAndWait Java

invokeAndWait Java
EN

Stack Overflow用户
提问于 2013-04-03 12:53:08
回答 3查看 565关注 0票数 3

有谁能告诉我,这两种代码之间的实际区别是什么,因为它们都产生了相同的结果?

code1:

代码语言:javascript
复制
public class JLabelDemo extends JApplet {
public void init() {
    this.setSize(400, 400);
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

code2:

代码语言:javascript
复制
public class JLabelDemo extends JApplet {
private static final long serialVersionUID = 1L;

public void init() {
    this.setSize(400, 400);
    try {
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                makeGUI();
            }
        });
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private void makeGUI() {
    ImageIcon ii = new ImageIcon("Flock_icon.png");
    JLabel jl = new JLabel("<<--- Flock_icon", ii, JLabel.CENTER);
    add(jl);
}
}

我真的没有发现所产生的输出之间有什么区别。但我不明白密码。

那么,有人能给我一个invokeAndWait方法的真实例子吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-03 13:02:10

对于code1,2分配和添加将在线程调用init()时执行。如果这不是事件分派线程,那么可能会出现问题,因为Swing文档指出,几乎所有Swing的使用都应该在事件分派线程上完成。

对于code2,对Swing的调用保证在事件分派线程上执行。这是做事情的正确方法。它是丑陋和复杂的,您还不理解它(目前),但是如果init()将在除EDT之外的任何线程上被调用,这是正确的方法。

票数 2
EN

Stack Overflow用户

发布于 2013-04-03 12:57:49

invokeAndWait意味着它将在一个单独的线程中执行该代码块,因此它在执行时不会阻塞主线程。它用于创建Swing GUI。

票数 1
EN

Stack Overflow用户

发布于 2013-04-03 13:04:45

在小型swing应用程序中,您不会看到任何不同。在更大的应用程序中,UI绘制需要更长的时间和/或涉及应用程序的多个线程,您可以在这里看到不同之处。

来自javadoc

invokeAndWait导致在AWT事件调度线程上同步执行doRun.run()。这个调用会阻塞,直到所有挂起的AWT事件都被处理,然后(然后) doRun.run()返回。当应用程序线程需要更新GUI时,应该使用此方法。它不应该从EventDispatchThread调用。

您还可以检查here

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

https://stackoverflow.com/questions/15787894

复制
相关文章

相似问题

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