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