有谁能告诉我,这两种代码之间的实际区别是什么,因为它们都产生了相同的结果?
code1:
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:
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方法的真实例子吗?
发布于 2013-04-03 13:02:10
对于code1,2分配和添加将在线程调用init()时执行。如果这不是事件分派线程,那么可能会出现问题,因为Swing文档指出,几乎所有Swing的使用都应该在事件分派线程上完成。
对于code2,对Swing的调用保证在事件分派线程上执行。这是做事情的正确方法。它是丑陋和复杂的,您还不理解它(目前),但是如果init()将在除EDT之外的任何线程上被调用,这是正确的方法。
发布于 2013-04-03 12:57:49
invokeAndWait意味着它将在一个单独的线程中执行该代码块,因此它在执行时不会阻塞主线程。它用于创建Swing GUI。
发布于 2013-04-03 13:04:45
在小型swing应用程序中,您不会看到任何不同。在更大的应用程序中,UI绘制需要更长的时间和/或涉及应用程序的多个线程,您可以在这里看到不同之处。
来自javadoc
invokeAndWait导致在AWT事件调度线程上同步执行doRun.run()。这个调用会阻塞,直到所有挂起的AWT事件都被处理,然后(然后) doRun.run()返回。当应用程序线程需要更新GUI时,应该使用此方法。它不应该从EventDispatchThread调用。
您还可以检查here。
https://stackoverflow.com/questions/15787894
复制相似问题