invokeLater和NetBeans中的主类



当使用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方法并不理想,所以我可能会移动它。

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

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

因为变量tClass在run方法之外是不可访问的,并且run方法除了在它上面调用setVisible之外什么也不做。

如果必须调用实例上的两个或多个(void)方法,则需要使用变量来保存对实例的引用,并且不能使用令您困惑的"一行"技巧:

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

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

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

相关内容

  • 没有找到相关文章

最新更新