在 main 方法中使用 SwingUtilities.invokeLater()

2023-12-09

我最近看到一个MVC java应用程序,其中main方法编写为:

    public static void main(String[] args) 
    {
        SwingUtilities.invokeLater(new Runnable() 
        {
            public void run() 
            {
                View view = new View();
                Model model = new Model();
                Controller controller = new Controller(view, model);
                controller.start();
            }
        });
    }

这是否会让所有程序(包括模型和控制器,与 Swing 完全无关)运行直到代码在 AWT 事件调度线程而不是主线程中结束?

如果最后一个是真的,那么这对应用程序来说真的很糟糕,因为它会阻止 EDT 执行它需要的任务(例如,调度事件,因为模型可能正在计算其他任务)。这是对的吗?


有一个类似的old post(不是与此重复的)可以表明上面提到的代码是很好的实践,所以它让我更加困惑。


您显示的代码片段的目的是createSwing UI 和模型并将它们连接在一起。

没有 Swing 更新(就对用户输入的反应而言),因为在更新之前不能有任何用户输入run()方法结束。

虽然您可以在主线程和 EDT 之间拆分这些任务(并且可能会在首次显示 UI 之前获得几毫秒的时间),但这也会使应用程序的设计变得复杂(多线程不是一个简单的主题),并且会导致代码库乱七八糟invokeLater()来电。在有人证明有必要之前我不会这样做。


恕我直言,美国东部时间is任何 GUI 应用程序中的主线程。对用户输入的每个反应都在此线程中开始,并且 UI 的每次更新都必须在此线程中完成。

长时间运行的任务应该在后台线程中完成 - 这通常意味着任何需要超过几毫秒的任务。

如果创建模型需要几秒钟怎么办?

在这种情况下,我会尝试将模型创建分为两部分:

  • 创建所需的最小部分,以便可以显示 UI。这应该在 EDT 中完成(因为无论如何用户都必须等待这部分的完成 - 在显示 UI 之前他无法与其交互)
  • 在后台线程中执行剩余的长时间运行的部分。

如果无法做到这一点怎么办?(即在模型完全初始化之前,UI 无法显示)

在这种情况下,用户必须等待模型完成初始化,然后才能查看和使用 UI。所以这个初始化是在 EDT 还是在主线程上运行并不重要。因此,请使用更简单的解决方案:EDT 上的所有内容。

但是通过显示一个提示来提示用户您的应用程序正在启动启动画面

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 main 方法中使用 SwingUtilities.invokeLater() 的相关文章

随机推荐

  • 通过调用 PHP 脚本从 Javascript 更新数据库

    我一直想得到这个 我正在建立一个有活动墙的网站 除了 喜欢 和 不喜欢 按钮之外 所有功能都可以正常工作 我目前只显示一个我喜欢或不喜欢的文本框 a href Like a or a href Unlike a 现在这些称为这些脚本
  • 如果选择单选按钮,则对复选框执行验证

    我正在尝试处理此表单 因此当选择第一个单选按钮时 请运行特定的验证 当选择第二个单选按钮时 运行不同的验证等 当前使用警报来检查功能 但无论我选择哪个单选按钮 我都不会收到任何反馈 JavaScript 函数
  • 在 carouse android 中为每张照片设置标题和描述

    我正在为我的应用程序使用 carouselView 库 https github com sayyam carouselview 图像正在显示 轮播正在工作 但如何在每个图像滑动时在每个图像下方设置标题和描述 我有一个包含每个图像的所有标题
  • 录制和编码 Flash 视频?

    是否可以通过Flash的 网络摄像头 设施录制视频并在服务器端接收编码视频无需任何进一步处理 即仅将流保存到文件中 或者服务器端软件是否总是需要对输入进行编码 如果需要服务器端软件 是否有免费 开源解决方案可用 是的 你必须使用服务器端软件
  • Edge 浏览器似乎丢弃响应负载

    我有一个网络应用程序 可以将 PDF 返回到浏览器 该应用程序在 Chrome 和 Firefox 中运行良好 但在 Edge 版本 38 14393 0 0 中不起作用 响应标头如下所示 Access Control Allow Head
  • blit 错误的目标位置无效

    我收到这个错误 这是完整的回溯 Traceback most recent call last File C Users hobin PycharmProjects codeitPython Snake game py line 103 i
  • 为 Strapi 自定义 CKEditor 会出现“ckeditor-duplicated-modules”错误

    我尝试修改this存储库来自定义我想在我的 Strapi 项目中使用的 CKEditor 我添加了更多插件 这就是我的 ckeditor js 文件的样子 import ClassicEditorBase from ckeditor cke
  • Android 中获取相邻单元格返回 null

    我正在尝试获取 Android 中的相邻小区信息 但该功能getNeighboringCellInfo 总是返回 null 我使用了以下代码 protected void getCellInfo TelephonyManager telep
  • 动态创建包含子查询的 Linq 表达式

    我最近偶然发现了在运行时动态创建 Linq 表达式的问题 我发现的大多数示例都处理相当简单的任务 即仅将给定数据库实体的一个属性与单个参数进行比较 就像这样 Session Query Where m gt m Name Contains
  • 为什么 LINQ .Where(predicate).First() 比 .First(predicate) 更快?

    我正在做一些性能测试 并注意到像这样的 LINQ 表达式 result list First f gt f Id i Property 慢于 result list Where f gt f Id i First Property 这似乎违
  • joomla 垃圾邮件机器人错误

    在 joomla 2 5 中使用 widgetkit 地图 yotheme 的外部组件 当我插入电子邮件地址时 joomla 会检测到并给出此错误 该电子邮件地址已受到垃圾邮件机器人的保护 您需要启用 JavaScript 才能查看它 Ja
  • 集合已修改;枚举操作可能无法执行[重复]

    这个问题在这里已经有答案了 这个问题在这个论坛上被问过很多次了 我知道问题的解决方案 但我很好奇为什么 修改集合时无法执行枚举操作 List
  • 删除 pandas 数据框中未命名的列[重复]

    这个问题在这里已经有答案了 我有一个来自 A G 列的数据文件 如下所示 但是当我使用pd read csv data csv 它打印一个额外的unnamed无缘无故地列在最后 colA ColB colC colD colE colF c
  • 以编程方式在 IIS 中启用或禁用匿名身份验证

    我有一个 Web 应用程序 我需要为其用户提供将登录方法从 FormsAuth 切换到 WindowsAuth 的选项 我设法通过代码更改 web config 文件 Configuration config WebConfiguratio
  • 重用函数而无需实例化新类的最简单方法

    我目前有一个如下所示的函数 public void AnimateLayoutTransform object ControlToAnimate Does some stuff 我在很多不同的项目中使用这个函数 所以我希望它具有很强的可重用
  • 线程终止问题(C 编程)

    我正在开发一个使用 C 语言的 Linux 应用程序 它使用多个线程 由主函数生成的线程完成大部分工作 因此通常最后完成 我看到一些奇怪的行为 我相信这是由于主线程在生成的线程有机会完成其工作之前终止 下面是一些示例代码来说明我正在讨论的内
  • 详细订单中的 Woocommerce Short_Description

    我正在使用 Wordpress 和 Woocommerce 创建我的新网站 我想在订单详细信息中显示简短的描述 我找到了这段代码 add action woocommerce after shop loop item title wooco
  • 将设计添加到plotLabel Highcharts

    我正在制作 highchart 上的动态图表 我的问题是 有没有办法在我的绘图标签上添加设计 目前是这样的 我希望它看起来像这样 这是我的代码 function Highcharts setOptions global useUTC fal
  • Google App Engine + jQuery Ajax = 405 方法不允许

    必须有人能够解释我在这里做错了什么 我正在尝试创建最简单的 AJAX 发布到 Google App Engine 应用程序的示例 但我失败了 这是应用程序Python import cgi from google appengine api
  • 在 main 方法中使用 SwingUtilities.invokeLater()

    我最近看到一个MVC java应用程序 其中main方法编写为 public static void main String args SwingUtilities invokeLater new Runnable public void