我一直在阅读SwingUtilities.invokeLater()方法,并且在很大程度上了解了它的用途。在处理GUI组件时,对这些组件的所有操作都需要在同一Event线程上完成,以避免出现种族冲突等。
但是,我认为许多问题未能扩展,因此代码实际上是如何工作的?看着它:
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
//method body code
}
);
我的问题是,这如何工作?我们正在向invokeLater()方法传递一个新的Runnable obj(无论如何我都认为Runnable是一个接口,我们如何实例化构造函数new Runnable()
?),然后将整个方法主体与其一起附加到方法内部通话:{//Method body code});
。那怎么可能?我从未见过一种方法将整个方法主体作为其参数之一。
当我尝试使用自己的方法复制此方法时,出现错误,指示无法在方法参数内提供整个方法主体。因此,我回到了最初的问题,即实际上是如何工作的。也许我想的太过疏忽,但是任何帮助都将不胜感激。
谢谢。
答案 0 :(得分:3)
Anonymous Classes。您可以传递实现Runnable
的 any 类,甚至是匿名类。
答案 1 :(得分:2)
我有,这是怎么工作的?
您正在使用匿名类来实现run()
接口的Runnable
方法。
您还可以执行以下操作:
Runnable run = new Runnable()
{
public void run()
{
//method body code
}
};
SwingUtilities.invokeLater( run );
答案 2 :(得分:2)
除了其他答案,我想添加此内容。
为了了解您的Java代码示例
SwingUtilities.invokeLater(new Runnable() {
public void run() {
//method body code
}
);
了解Java编译器实际如何处理它很有帮助。 编译器执行以下两项操作:
它创建一个匿名类
(花式类名以$1
或类似的结尾)
实施Runnable
接口:
class YourEnclosingClass$1 implements Runnable {
public void run() {
//method body code
}
}
然后它与new
运算符一起使用此匿名类:
SwingUtilities.invokeLater(new YourEnclosingClass$1());
答案 3 :(得分:0)
因为Runnable
是一个接口,所以只有run
方法的存根。创建此接口的实例时,必须提供该接口的实现。
就像艾略特(Elliot)所说的:匿名类。