0

我是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()方法,该方法创建一个包含run()方法的Runnable对象,该方法本身执行作为我的 Swing 应用程序入口点的runApp()方法。

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

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

4

1 回答 1

2

这真的是两个问题合而为一。

  1. SwingUtilities.invokeLater()确保您想做的任何事情都发生在 Event Dispatcher 线程上。由于 Swing 严格来说是单线程的,因此所有与 Swing 交互且尚未在 EDT 中运行的东西(例如,作为事件处理程序的结果调用)main()都需要它。应用程序的方法就是这样一个示例,因为它被调用由虚拟机在其自己的单独线程中启动(不出所料,称为主线程)。
  2. 这是一个匿名内部类。这是创建类的快捷方式,该类可以立即实现Runnable并创建该类的实例。(请注意,这样做并不完全等同,有一些小而重要的细节有所不同。)SwingUtilities.invokeLater()然后将此Runnable对象放入 Swing 事件队列中,由 EDT 处理(通常是几分钟) ) 稍后,调用run()您提供的方法。
于 2015-06-06T15:41:32.347 回答