java - 对执行 Swing 应用程序的主类中的 SwingUtilities.invokeLater() 方法的调用到底是什么?

标签 java swing user-interface swingutilities java-threads

我对 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);
    }

}

因此,此类包含 ma​​in() 方法,该方法是应用程序启动时执行的方法。

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

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

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

最佳答案

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

  1. SwingUtilities.invokeLater()确保您想要做的任何事情都发生在事件调度程序线程上。 Since Swing is strictly single threaded ,这对于与 Swing 交互且尚未在 EDT 中运行的所有内容都是必需的(例如,由于事件处理程序而被调用) main()应用程序的方法就是一个这样的例子,因为它是由虚拟机在启动时在其自己的单独线程(毫不奇怪地称为主线程)中调用的。
  2. 这是 anonymous inner class 。这是创建实现 Runnable 的类的快捷方式并立即创建该类的实例。 (请注意,这并不完全等同于这样做,有一些小但重要的细节有所不同。) SwingUtilities.invokeLater()然后将这个 Runnable Swing 事件队列中的对象,稍后将由 EDT(通常是几分钟)处理,调用 run()您提供的方法。

关于java - 对执行 Swing 应用程序的主类中的 SwingUtilities.invokeLater() 方法的调用到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30684650/

相关文章:

user-interface - 如何防止 MATLAB GUI 中的 LATEX 标签变得模糊?

java - 图像和图形Java

java - 如何使用逗号从我的数据库表的特定列中拆分值?

java - 如何在Netbean的设计模式下更改JAVA SWING控件名称

java - 如何在关闭窗口时自动保存 TextArea 中的内容?

java - 数组中的 GUI 按钮

java - 跨 Java 和 Javascript 模板语言?

java - 如何在 8 秒内完成 Ads_Fullscreen Activity 并在之后执行 MainActivity?

java - frame.revalidate() 对于在事件发生后获取输出很重要吗?

user-interface - Flutter 如何从子小部件更改父 BottomNavigationBar 索引