为什么我的样板Java桌面应用程序JFrame在main方法中使用EventQueue.invokeLater?

War*_* P 4 java swing

我使用最新的Eclipse和GWT Designer来用Java创建swing应用程序.我的应用程序窗口中的主要功能(这是一个javax.swing.JFrame)在工具生成的auto中如下所示:

    /* launch the application */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                AppWindow window = new AppWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

这似乎是围绕着这可能是一个很大的噪音:

public static void main(String[] args) {
            try {
                AppWindow window = new AppWindow();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }


}
Run Code Online (Sandbox Code Playgroud)

我已经读过在某些情况下需要EventQueue.InvokeLater技术,另一个问题是在这里询问使用它的位置.

我的问题更简单; 为什么在代码生成器中会自动执行此操作?为什么main应该快速返回并让事件队列稍后创建应用程序窗口?难道不会阻止这一点吗?为什么JFrame自动生成的设计器会执行此EventQueue?我试图在启动和显示表单方面看到一些不同,无论这个代码是以更简单的方式还是更难的方式完成,我只能暂时断定这有一些好处,这些好处在初学者制作的小型演示应用程序中不可见像我一样,也许在现实世界的大型复杂Jframe类中,这种延迟/排队策略有一些好处吗?

Nat*_* W. 7

根据您的应用程序及其使用方式,可能会EventQueue在调用main方法之前或期间在屏幕上绘制(因此使用).应该修改任何UI组件的调用,Event Dispatch Thread这包括设置应用程序可见.

所以为了安全起见,开始使用应用程序是一个很好的做法EDT.

为什么在代码生成器中会自动执行此操作?

它不会伤害,它很容易产生,并且它被认为是良好的做法.

为什么main应该快速返回并让事件队列稍后创建应用程序窗口?

main方法可能是从其他正在使用的应用程序调用的,EDT并且可能已在屏幕上绘制了某些内容.如果直接绘制应用程序main,则可能是您的应用程序可能正在更改某些正在处理的组件EDT,并且可能已在屏幕上绘制.

所以为了安全以防万一这种情况发生,你应该把它留给EDT绘制你的应用程序,这样它就可以在不干扰任何其他事情的情况下完成它.

难道不会阻止这一点吗?

除非main通过双击桌面图标启动用户启动的JVM进程以外的其他操作,否则main只要屏幕上有内容,返回时就不会产生任何影响.

我只能暂时断定这有一些好处,这些好处在像我这样的初学者制作的小型演示应用中是看不到的

你是对的 - 大部分时间它可能不会有所作为,但我认为它们包括它因为它易于生成和实现,它不会受到伤害,并且它将是良好实践的例证.