SwingUtilities.invokeLater(new Runnable() {
public void run() {
Example ex = new Example();
ex.setVisible(true);
}
});
下面是一段代码new Runnable()
。我如何理解这段代码?我不记得我们可以将代码块直接传递给 java 中的任何对象。
它不是代码块。它是一个对象。
当你说,
new Runnable()
您正在创建一个实现 Runnable 接口的对象,特别是run()
方法。
正如方法名称所暗示的,invokeLater()
将在稍后的某个时间点调用run()
您的可运行接口实现对象(或可运行对象)的方法。
正如另一张海报提到的,这是匿名类的一个例子。它确实是一种以更简洁的方式快速编写代码的便利机制。如果你不喜欢这样,你可以这样做——
创建一个实现 Runnable 的新类 -
public class RunnableImplementation implements Runnable
{
public void run()
{
Example ex = new Example();
ex.setVisible(true);
}
}
然后,您示例中的代码变为 -
SwingUtilities.invokeLater(new RunnableImplementation());
它正在创建一个匿名内部类的实例。与其从命名类派生并创建它的实例,不如Runnable
内联完成整个事情。
请参阅匿名类。
您没有传递任何代码块,您实际上是在覆盖类的run
方法Runnable
如何理解这段代码?这就是所谓swing event queue
的,它有助于防止并发问题。它按顺序调用此队列中run()
每个对象的方法。Runnable
你的代码
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Example ex = new Example();
ex.setVisible(true);
}
});
相当于
SwingUtilities.invokeLater(new MyRunnable() );
whereMyRunnable
是一个Runnable
使用您拥有的代码实现接口的类,并且仅为此目的而创建并且不能再次使用。
注意MyRunnable
不是实际名称,只是为了说明这一点而编造出来的。