我正在学习Java Swing,我对这个简单的代码教程有些疑问:
package com.andrea.execute;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
/* An istance of a SimpleExample class is a JFrame object: a top level container */
public class SimpleExample extends JFrame {
/* Create a new SimpleExample object (that is a JFrame object) and set some property */
public SimpleExample() {
setTitle("Simple example");
setSize(300, 200);
setLocationRelativeTo(null); // Center the window on the screen.
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SimpleExample ex = new SimpleExample();
ex.setVisible(true);
}
});
}
}
逻辑很简单:我有一个继承自 JFrame Swing类的 SimpleExample 类。因此 SimpleExample 将是一个顶级容器。
这个类还包含 main()方法,现在我有两个疑问:
1)为什么在main()方法中执行此代码:
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
SimpleExample ex = new SimpleExample();
ex.setVisible(true);
}
});
它在SwingUtilities类上调用 invokeLater()方法,并向其传递一个新的Runnable对象。
阅读我知道的文档,这是将应用程序放在Swing Event Queue上的一种方法。它用于确保所有UI更新都是并发安全的。
我有一些问题要理解它是如何实现的。
在 invokeLater()方法的输入参数内,它传递了这个“东西”:
new Runnable() {
@Override
public void run() {
SimpleExample ex = new SimpleExample();
ex.setVisible(true);
}
});
这是什么东西?什么代表?以及它是如何工作的?
TNX
安德烈
答案 0 :(得分:4)
anonymous class实施Runnable interface。
您可以在没有匿名类的情况下使用它,例如:
class SimpleExample extends JFrame {
public SimpleExample() {
setTitle("Simple example");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new App());
}
}
class App implements Runnable {
public void run() {
SimpleExample ex = new SimpleExample();
ex.setVisible(true);
}
}
但是匿名课更方便。
答案 1 :(得分:1)
Runnable是一个包含run方法的接口。 invokeLater需要runnable的这个实现来从swing线程调用传递的run方法。
请参阅此链接以获取更多信息 http://en.wikibooks.org/wiki/Java_Programming/Threads_and_Runnables
答案 2 :(得分:1)
javax.swing.SwingUtilities#invokeLater(Runnable doRun)
,安排java.lang.Runnable
执行
在事件线程上(可从任何线程调用);