invokeLater和NetBeans

时间:2015-08-02 07:10:44

标签: java swing netbeans main invokelater

在使用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 个答案:

答案 0 :(得分:1)

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方法移动到单独的类可能是有意义的。