启动 Java Swing 桌面应用程序的正确方法

2024-02-04

启动需要 5-10 秒从数据库检索初始数据的应用程序的正确方法是什么?这是我到目前为止所得到的,但我不确定是否有更好的方法。我希望 GUI 和数据库访问位于不同的线程中,以便 GUI 构建与数据检索同时发生。

public static void main(String[] args) {
    final Controller controller = new Controller();
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            View frame = new View();
            controller.setView(frame);
        }
    });
    Model model = new Model();
    controller.setModel(model);
    controller.getInitialData();
}

你走在正确的轨道上。希望这会让事情变得更加清楚......

Swing 不是线程安全的。话虽这么说,您可以做几件事。一种选择是使用SwingUtilities http://download.oracle.com/javase/6/docs/api/javax/swing/SwingUtilities.html发布一个Runnable事件调度线程上要执行的任务。这将使您能够从数据库检索数据并在单独的线程中更新 UI,同时尊重 Swing 的单线程模型。

SwingUtilities.invokeLater(new Runnable(){
    @Override
    public void run(){
        //  update UI
    } 
});

由于这是一项长时间运行的任务,另一种选择是使用SwingWorker http://download.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html在完成时或处理时向 UI 提供更新。

正如您所看到的,这两种机制(即SwingUtilities and SwingWorker)使您能够将此类任务专用于其他线程,同时使您能够将结果(通常转换为操作)放在EventQueue以供稍后(且安全)执行。无论您选择哪一个,重要的是要记住,长时间运行的任务永远不应该在EDT。因此,正如我所发现的,任何精心设计的 GUI 最重要的特征是反应能力.

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

启动 Java Swing 桌面应用程序的正确方法 的相关文章

随机推荐

  • MVC 4 客户端验证不起作用

    谁能告诉我为什么客户端验证在我的 MVC 4 应用程序中不起作用 layout cshtml Scripts Render bundles jquery RenderSection scripts required false 在我的 we
  • 使用 Flex 和 Bison 的简单 Java 语法

    我最近开始学习基本的 Flex 和 Bison 因为我必须为简单 但不是太简单 语法制作一个解析器 我决定在我的语法中制作一种简化的 Java 语言 我做了 l和 y文件和所有内容都编译没有错误 我正在使用 gcc 进行编译 问题是每次我运
  • 查找一个文件中不存在于另一个文件中的行[重复]

    这个问题在这里已经有答案了 我有两个文件 假设a txt and b txt 两者都有一个名称列表 我已经跑了sort在这两个文件上 现在我想找到来自a txt哪些不存在于b txt 我花了很多时间寻找这个问题的答案 所以记录下来以供将来参
  • 使用 Amazon Beanstalk 部署 play2 应用程序的最佳方式

    我发现零碎的指令here https stackoverflow com questions 11918820 java play 2 deployment以及其他一些关于在 amazon ec2 上部署 Play2 应用程序的地方 但没有
  • 为什么以及如何在 React 组件中使用类名实用程序?

    您能简单地向我解释一下使用的目的是什么吗类名 https github com JedWatson classnamesReact 代码中的实用程序 我刚刚阅读了 Classnames 文档 但我仍然无法理解在代码中使用它的主要原因是什么
  • 我可以在 C++ 项目中混合使用 c 和 cpp 文件吗?

    我有一个项目 其中混合了 c 文件和 cpp 文件 链接器向我抛出错误 undefined reference to
  • 如何在C#中嵌入VBS并运行它?

    我有一个运行良好的 VBScript 我有一个 C 程序 可以使用 cscript 程序运行 VBScript 我想要做的是将 VBS 嵌入到 C exe 中 这样它就是一个文件 并且能够运行 VBS 文件 有什么方法可以将嵌入式 VBSc
  • Android 无法实例化应用程序 java.lang.ClassNotFoundException:

    我正在开发 Android 市场上托管的应用程序 有时 每月一次 我收到一份崩溃报告 无法实例化应用程序 java lang ClassNotFoundException 应用程序下载量在 10 000 50 000 之间 我不知道为什么在
  • 如何将图像添加到 JFrame 标题栏?

    我想添加一个图像 小图标 到javax swing JFrame标题栏 我该怎么做 Since JPanel没有标题栏 我假设您指的是JFrame 话虽如此 使用setIconImage http download oracle com j
  • C++11 std 相当于 Boost has_dereference

    Boost 的许多 SFINAE 助手已经随 C 11 一起出现在 std 库中 但是has dereference似乎没有 除了这个功能之外 我已经设法从我的包中消除了 Boost 依赖项 并且我想完全摆脱它 那么如何最好地仅使用 C 1
  • XML 转换和换行符

    好的 我有适用于此 xml 的代码
  • 使用java的小型http服务器?

    我使用 java 创建了以下测试服务器 import java io import java net class tcpServer public static void main String args ServerSocket s nu
  • PostgreSQL 使用组和顺序计算滚动平均值

    我有一张表如下 id x y value 1 1 1 25 1 1 2 42 1 2 3 98 1 2 4 54 1 3 5 67 2 1 1 78 2 1 2 45 2 2 3 96 我必须按 id 对其进行分组 同时按 id x 和 y
  • 尝试安装 VS2019 扩展会导致 NullReferenceException

    自 VS 2019 发布以来 我一直无法向其添加扩展 我最近更新到版本 16 4 3 但当我尝试添加扩展时仍然遇到相同的错误 我尝试执行以下操作 但仍然失败并出现上面的错误对话框 从 Visual Studio 中的扩展管理器安装 从 Ma
  • 在 NSUserDefaults Xcode 中存储和更新 Swift 字典

    我想在用户输入值时存储和更新字典 一切似乎都正常 直到这段代码 并且应用程序崩溃了 override func viewDidLoad super viewDidLoad if NSUserDefaults standardUserDefa
  • 将字体设置为斜体和粗体

    如何将多种字体样式应用于文本 System Drawing Font MyFont new System Drawing Font thisTempLabel LabelFont float thisTempLabel fontSize F
  • Hibernate 的代码优先方法

    我是一名 PHP 开发人员 正在学习 Java Spring MVC Hibernate 我想知道 Hibernate 是否支持像 Entity is ASP NET 或 Doctrine with PHP 这样的代码优先方法 到目前为止我
  • Flutter - 如何删除单个 google_maps_flutter ^0.5.21 标记?

    自成立以来发生了很大变化google maps flutter 这意味着删除单个标记的过程也发生了变化 我在这个问题的旧查询中发现了什么 删除版本 0 0 1 上的标记 https stackoverflow com questions 5
  • 如何从 Slack 机器人发送定期短暂(“隐藏”)消息

    我有兴趣编写一个 Slack 机器人 它会定期向用户发送 短暂 消息 临时消息是出现在频道内的消息 但只能由特定用户看到 例如对机器人 斜杠命令 例如 who 的响应 然而 这里的目标是让机器人定期发送临时消息 并且 出现在频道消息流中 即
  • 启动 Java Swing 桌面应用程序的正确方法

    启动需要 5 10 秒从数据库检索初始数据的应用程序的正确方法是什么 这是我到目前为止所得到的 但我不确定是否有更好的方法 我希望 GUI 和数据库访问位于不同的线程中 以便 GUI 构建与数据检索同时发生 public static vo