3

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

代码1:

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);
}
}

代码2:

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方法的真实示例吗?

4

3 回答 3

2

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

对于 code2,对 Swing 的调用保证在事件调度线程上完成。这是做事的正确方法。它既丑陋又复杂,而且你(还)不理解它,但如果 init() 将在 EDT 以外的任何线程上调用,它就是正确的做事方式。

于 2013-04-03T13:02:10.703 回答
1

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

于 2013-04-03T12:57:49.767 回答
0

您不会在小型摆动应用程序中看到任何差异。在 UI 绘制需要较长时间和/或应用程序中涉及多个线程的较大应用程序中,您可以看到差异。

来自 javadoc

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

你也可以在这里查看

于 2013-04-03T13:04:45.213 回答