【问题标题】:SwingUtilities method param contains entire method body?SwingUtilities 方法参数包含整个方法体?
【发布时间】:2018-08-01 20:24:24
【问题描述】:

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

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

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

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

当我尝试用我自己的方法复制它时,我收到错误消息,表明我无法在方法参数中提供整个方法主体。因此,我回到我最初的问题,即这实际上是如何工作的。也许我想太多/忽略了,但非常感谢任何帮助。

谢谢。

【问题讨论】:

标签: java swing


【解决方案1】:

Anonymous Classes。您可以传递实现Runnable任何类,甚至是匿名类。

【讨论】:

  • 感谢您的帮助。以前从未听说过匿名课程。我想我还有更多的阅读要做......
【解决方案2】:

我有,这是怎么回事?

您正在使用匿名类实现Runnable 接口的run() 方法。

你也可以这样做:

Runnable run = new Runnable()
{
    public void run()
    {
        //method body code
    }
};

SwingUtilities.invokeLater( run );

【讨论】:

  • 感谢 camickr 的帮助。正如我在上面对 Elliot 所说的那样,以前从未听说过匿名课程。您的解释以及 javadocs 已经澄清了这一点
【解决方案3】:

除了其他答案之外,我想补充一下。
了解您的 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());
    

【讨论】:

    【解决方案4】:

    因为Runnable是一个接口,所以只有run方法的stub。当您创建此接口的实例时,您必须提供该接口的实现。

    就像 Elliot 所说:匿名课程。

    【讨论】:

      猜你喜欢
      • 2011-07-26
      • 1970-01-01
      • 2023-03-07
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2011-12-04
      相关资源
      最近更新 更多