SwingUtilities方法参数包含整个方法主体吗?

时间:2018-08-01 20:24:24

标签: java swing

我一直在阅读SwingUtilities.invokeLater()方法,并且在很大程度上了解了它的用途。在处理GUI组件时,对这些组件的所有操作都需要在同一Event线程上完成,以避免出现种族冲突等。

但是,我认为许多问题未能扩展,因此代码实际上是如何工作的?看着它:

SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
        //method body code
    }
);

我的问题是,这如何工作?我们正在向invokeLater()方法传递一个新的Runnable obj(无论如何我都认为Runnable是一个接口,我们如何实例化构造函数new Runnable()?),然后将整个方法主体与其一起附加到方法内部通话{//Method body code});。那怎么可能?我从未见过一种方法将整个方法主体作为其参数之一。

当我尝试使用自己的方法复制此方法时,出现错误,指示无法在方法参数内提供整个方法主体。因此,我回到了最初的问题,即实际上是如何工作的。也许我想的太过疏忽,但是任何帮助都将不胜感激。

谢谢。

4 个答案:

答案 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)所说的:匿名类。