我对 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() 方法,该方法是应用程序启动时执行的方法。
它执行 SwingUtilities.invokeLater() 方法,该方法创建一个 Runnable 对象,该对象包含本身执行 run() 方法>runApp() 方法是我的 Swing 应用程序的入口点。
我的疑问与 SwingUtilities.invokeLater() 方法的具体作用有关。具体是做什么的呢?作为 invokeLater() 方法参数创建的 Runnable 对象是什么?在我看来,它是一个自动实现 Runnable 接口(interface)的对象,但我不确定它,我也不清楚为什么要这样做。
你能帮我理解这个简单的 Swing 应用程序的架构到底是如何工作的吗?
最佳答案
这实际上是两个问题合而为一。
-
SwingUtilities.invokeLater()
确保您想要做的任何事情都发生在事件调度程序线程上。 Since Swing is strictly single threaded ,这对于与 Swing 交互且尚未在 EDT 中运行的所有内容都是必需的(例如,由于事件处理程序而被调用)main()
应用程序的方法就是一个这样的例子,因为它是由虚拟机在启动时在其自己的单独线程(毫不奇怪地称为主线程)中调用的。 - 这是 anonymous inner class 。这是创建实现
Runnable
的类的快捷方式并立即创建该类的实例。 (请注意,这并不完全等同于这样做,有一些小但重要的细节有所不同。)SwingUtilities.invokeLater()
然后将这个Runnable
Swing 事件队列中的对象,稍后将由 EDT(通常是几分钟)处理,调用run()
您提供的方法。
关于java - 对执行 Swing 应用程序的主类中的 SwingUtilities.invokeLater() 方法的调用到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30684650/