【问题标题】:GUI layer vs Code layer vs SwingGUI 层 vs 代码层 vs Swing
【发布时间】:2011-03-27 04:12:11
【问题描述】:

我总是使用 C++ 编写控制台应用程序并学习了一些基本的 UML/模式技能。

现在我决定迁移到 Java 并在我的程序中添加 GUI。

第一个问题是程序设计中如何处理GUI层。我的意思是,我应该如何将所有 GUI 代码(添加组件、基本事件处理)与真正完成工作的代码(例如,按下某个按钮时)分开。

另一个与 EDT 相关的问题。我读到(几乎)所有 Swing 组件都必须在同一个线程(通常是 EDT)中运行,因为它们不是线程安全的。所以我认为如果“繁重的代码”是从(例如)ActionListener 调用的,那么 GUI 将在一段时间内变得无响应,直到“繁重的代码”完成。

这是非常不可取的,所以我认为自然的解决方案是在另一个线程中运行繁重的代码或执行类似的操作(我知道这必须小心完成,因为我不能再假设用户之后单击一个按钮,“深度操作”在处理另一个 GUI 事件之前完成)。

如您所见,我有很多关于如何在我的模式中包含 GUI 以保持完全独立且易于维护的问题;以及一些关于 Swing 组件和响应能力的特定问题。

【问题讨论】:

    标签: java swing user-interface design-patterns


    【解决方案1】:

    重新将业务逻辑与 GUI 分离:如果您打算使用 Swing,首先要研究 Model-View-Controller design pattern。这是一个很好的关注点分离模式,Swing 非常依赖它。

    重载代码和 EDT:使用 SwingUtilities,甚至更好,SwingWorkers

    【讨论】:

      【解决方案2】:

      您会发现 Swing 已经被大量结构化为他们称为 view-delegate 的 MVC 变体。
      您需要做的是决定有多少应用程序逻辑进入 GUI 层,并且总有一些。有帮助的一件事是,如果 gui 操作旨在执行一项重要任务 - 例如更新数据库中的某些数据,那么请确保 GUI 操作处理程序可以调用一个与 gui 无关的简单调用代码/结构。这可以通过在 IDE 中使用具有单向依赖关系的项目来强制执行。例如,将所有 GUI 代码保存在依赖于“通用”项目的“gui”项目中。 "common" 项目将能够执行业务逻辑,但不导入 swing 小部件,也看不到您的 "gui" 项目。

      很高兴您将 EDT 确定为关键设计问题 - 因为确实如此。 LBT 已经建议使用 SwingWorker,这是在单独的线程上管理长时间运行的 gui 任务的好方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-22
        • 2022-01-20
        • 1970-01-01
        • 2020-11-12
        • 2010-12-30
        相关资源
        最近更新 更多