任何人都可以告诉我这两个代码之间的实际差异是什么,因为它们都产生相同的结果?
代码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方法的真实例子吗?
答案 0 :(得分:2)
对于code1,2个分配和add在任何调用init()的线程上执行。如果这不是事件派发线程,那么可能是一个问题,因为Swing文档说几乎所有Swing的使用都应该在事件派发线程上完成。
对于code2,保证在事件派发线程上完成对Swing的调用。这是做事的正确方法。它是丑陋和复杂的,你还没理解它(但是),但如果在EDT以外的任何线程上调用init(),这是正确的做法。
答案 1 :(得分:1)
invokeAndWait
表示它将在一个单独的线程中执行该代码块,因此在执行时不会阻塞主线程。它用于创建Swing GUI。
答案 2 :(得分:0)
在小摆动应用中你不会看到任何差异。在更大的应用程序中,UI绘制需要更长的时间和/或应用程序中涉及多个线程,您可以看到差异。
来自javadoc
invokeAndWait导致在AWT事件调度线程上同步执行doRun.run()。此调用将阻塞,直到处理完所有待处理的AWT事件,并且(然后)doRun.run()返回。当应用程序线程需要更新GUI时,应使用此方法。它不应该从EventDispatchThread调用。
您还可以查看here。