invokeLater 和 NetBeans 中的主类

Posted

技术标签:

【中文标题】invokeLater 和 NetBeans 中的主类【英文标题】:invokeLater and the main class in NetBeans 【发布时间】:2015-10-24 12:08:51 【问题描述】:

在使用 NetBeans 创建新的 JFrame 项目时,我一直在研究自动生成的代码,并在我的 main 方法中遇到了这个问题:

java.awt.EventQueue.invokeLater(new Runnable() 
        public void run() 
            new TestClass().setVisible(true);
        
    );

在阅读了一些内容后,我开始了解 invokeLater 的必要性,以便在 EDT 中处理 GUI 组件。也就是说,这里实现的new TestClass().setVisible(true); 行对我来说有点令人难以置信。我在创建一个新实例的上下文中得到它......

TestClass tclass = new TestClass();
tclass.setVisible(true);

...但我不太了解上面run() 方法中发生的事情。该代码是否创建了一个匿名类?我遇到过这个术语,但还没有完全理解。我假设它不是以我上面列出的“教科书”方式创建实例,因为没有变量(我无论如何都能看到)来引用该实例。

顺便说一句,在我看来,在 JFrame 类(或任何 GUI 类)中包含您的 main 方法并不理想,所以我可能会移动它。

【问题讨论】:

【参考方案1】:

new TestClass().setVisible(true) 只是创建一个新实例,在其上调用setVisible(true),然后通过不保存对它的引用来“忘记”该实例。它实际上相当于

TestClass tclass = new TestClass();
tclass.setVisible(true);

因为变量 tClass 在 run 方法之外是不可访问的,而 run 方法除了在其上调用 setVisible 之外什么都不做。

如果必须调用实例上的两个或多个 (void) 方法,您将 需要 使用变量来保存对实例的引用,而您不能执行“一个-line" 让你感到困惑的技巧:

TestClass tclass = new TestClass();
tclass.setVisible(true);
tclass.methodX();

它不是一个匿名类(参见https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html),它类似于一个“匿名实例”,尽管我认为这个术语不存在。

根据您的项目布局,将main 方法移至单独的类可能是有意义的。

【讨论】:

啊,我想我跟着你了。保存对类的引用是没有用的,因为无论如何它都是 run 方法的本地引用。这样做的结果是,如果我需要访问该类中的任何实例变量,我需要创建该类的另一个实例来执行此操作。这似乎效率低下。 是的,我在解释中添加了一个附加部分

以上是关于invokeLater 和 NetBeans 中的主类的主要内容,如果未能解决你的问题,请参考以下文章

Java中 EvenQueue.invokeLater用法

SwingUtilities.invokeLater 做啥? [复制]

为啥在 main 方法中使用 SwingUtilities.invokeLater?

使用 invokeLater 后 Swing UI 不更新

带有invokelater的文档监听器进入无限循环

SwingUtilities.invokeLater