调用swingutility . invokelater()方法到执行Swing应用程序的主类中究竟做了什么?



我对Swing非常陌生,我对这个启动基于教程项目的Swing应用程序的主类有以下疑问:

package com.caveofprogramming.designpatterns.demo1;
import javax.swing.SwingUtilities;
import com.caveofprogramming.designpatterns.demo1.controller.Controller;
import com.caveofprogramming.designpatterns.demo1.model.Model;
import com.caveofprogramming.designpatterns.demo1.view.View;
public class Application {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                runApp();
            }
        });
    }
    public static void runApp() {
        Model model = new Model();
        View view = new View(model);
        Controller controller = new Controller(view, model);
    }
}

所以这个类包含main()方法,它是应用程序启动时执行的方法。

它执行 swingutility . invokelater ()方法,该方法创建一个Runnable对象,该对象包含run()方法,该方法本身执行runApp()方法,该方法是我的Swing应用程序的入口点。

我的疑问与 swingutility . invokelater ()方法到底做了什么有关。具体是什么?以及作为invokeLater()方法的参数创建的Runnable对象是什么?在我看来,它是一个自动实现Runnable接口的对象,但我不确定它,也不清楚我为什么要这样做。

你能帮我理解这个简单的Swing应用程序的架构是如何工作的吗?

这实际上是两个问题合二为一。

  1. SwingUtilities.invokeLater()确保你想做的任何事情都发生在事件调度线程上。因为Swing是严格的单线程,这是与Swing交互的所有东西都需要的,并且还没有在EDT中运行(例如,作为事件处理程序的结果被调用)。你的应用程序的main()方法就是这样一个例子,因为它是由VM在启动时在自己的单独线程(称为主线程)中调用的。这是一个匿名的内部类。这是创建实现Runnable的类并立即创建该类实例的快捷方式。(注意,并不完全等同于,有一些小但重要的细节是不同的。)然后,SwingUtilities.invokeLater()将把这个Runnable对象放在Swing事件队列中,稍后将由EDT处理(通常是几分钟),调用您提供的run()方法。

相关内容

  • 没有找到相关文章

最新更新