java - 我在哪里可以找到针对 Web 开发人员的 Java Swing GUI 的优秀、简短、面向体系结构的介绍?

标签 java swing architecture

我刚刚开始我的第一个 Java Swing 项目(之前主要做基于 Web 的应用程序),并尝试了解如何构建一个适当的架构,并在 MVC 组件之间分离关注点。

我发现的几乎所有文档都非常深入地介绍了每个 Swing UI 小部件如何工作和使用的细节,但所有示例都只是直接从扩展的类中调用程序逻辑,例如 JPanel - 这看起来很奇怪而且没有良好的架构。

最好是独立于IDE的,但如果出现这种情况,应该说在整个项目中,我们已经使用了Eclipse、JFormdesigner和JGoodies。

我还看到 JSR296 定义了一个框架,似乎解决了我的问题。我应该只使用实现它的东西吗?

最佳答案

这是 Java 编程的一个高度缺乏文档的领域。正如您所提到的,从 JFrame 或 JDialog 扩展到开发 GUI 并不是一个好的设计实践,但您在示例代码中随处可见。

JSR 296 是一个有用的起点,但它的架构存在一些严重的问题。我确实使用 JSR 296,但我有自己的风格,并且必须始终解决框架设计引入的问题。

我一直认为应该有一个讨论组/维基/专注于这个主题的东西。到目前为止,我发现各种富客户端库的 listserv 很有用,但并不全面。在我的空闲时间考虑开始吧:-)

因此,我无法为构建 Swing 应用程序的最佳实践提供任何明确的资源。但是我可以给你一些我发现的工具包和概念的指示,我一遍又一遍地使用。也许这些对你有用。此外,如果有足够多的人有兴趣讨论最佳实践、共享代码等……我很想参与其中。

首先,如果您要进行 Swing 开发,请列出一些绝对关键的库:

  • 绑定(bind) - 有许多库可以做到这一点(JGoodies、JSR295 已经分拆为一个名为 Better Beans Binding (BBB) 的开源项目,Eclipse 绑定(bind)框架)。我几年前开始使用 JGoodies,但我已经转向使用 BBB,因为我发现它的方法更直观。我不能强调绑定(bind)允许的声明式编码方法的优点 - 它会真正彻底改变您的代码
  • AppFramework(或其某种风格)- JSR 296 是从这里开始的地方。正如我上面提到的,它有一些问题——如果你确实使用 JSR296,我强烈建议你尽量避免使用位于框架核心的单例(除了作为注入(inject)框架组件的源)你实际上需要)。

  • 编辑 - 自从我写这篇文章后,我开始使用 GUTS在我们的项目中(这是一个基于 Guice 的应用程序框架 - 它最初是 JSR 296,但现在与它几乎没有共同之处)。 GUTS 仍然是一个年轻的项目,但如果您正在考虑框架,则值得一看。
  • GlazedLists - 如果你在 UI 中做任何涉及列表、表格或树的事情,你应该仔细看看 GlazedLists。这是一个令人难以置信的项目(不仅适用于 Swing 应用程序,而且在该领域确实大放异彩)
  • 验证 - JGoodies 有一个非常好的验证库。学习它,使用它,与它合而为一。实时验证是现代 Swing 应用程序中极其重要的部分。
  • MigLayout - Mig 布局管理器是最好的。我强烈建议不要使用 IDE GUI 构建器 - 学习 MigLayout(最多需要几个小时),然后手工编写代码。

  • 所以这些是我书中关键的、绝对必须拥有的图书馆。

    现在一些概念:

    A. 展示模型 - Martin Fowler 有很多关于这种设计模式的信息。总而言之,它在 GUI 级别将行为与表示分开。如果您习惯于 MVC,Presentation Model 会添加另一层分离,这对于“实时”UI 非常重要。我的所有观点都由相应的演示模型支持。最终的结果是 View 代码非常非常简单——专注于两件事:1. 布局,2. 将 View 组件绑定(bind)到表示模型。就是这样。

    B. View 不是 JPanel 的子类。相反,我遵循受 JGoodies 启发的技术,将 View 视为创建 JPanel 的构建器。基本模式是:
    public class MyView{
      private MyPresentationModel model;
    
      private JButton okButton;
      private JButton cancelButton;
      ...
    
      public MyView(MyPresentationModel model){
        this.model = model;
      }
    
      public JPanel buildView(){
        initComponents(); // this method actually creates the okButton and cancelButton objects
        bindComponentsToModel(); // this method binds those objects to the PresentationModel
        JPanel p = new JPanel(new MigLayout());
        p.add(...);
        ...
        return p;
      }
    }
    

    这种严格遵循的方法允许非常快速地开发易于维护的 UI。请注意,我们可以使用给定的 View 来构造多个 JPanel,这些 JPanel 都由同一个 PresentationModel 支持 - View 生成的一个面板中的更改将立即在同一 View 生成的另一个面板中可见。

    C. 使用操作而不是事件处理程序。 JSR 296 实际上在使 Action 易于创建和使用方面做得很好。

    D. 在 EDT 之外执行长时间运行的操作(甚至需要 100 毫秒的操作)。 JSR 296 通过它的任务支持使这变得相当容易——但是当涉及到异常处理时,296 的任务系统中有许多问题。如果您的属性更改反过来导致长时间运行的事件,请务必仔细考虑这些更改将发生在哪个线程上。使用 Tasks 是对开发方式的重大改变,但对于任何真正的 Swing 应用程序来说,它都是一个非常重要的领域 - 花点时间了解它。

    E. 资源注入(inject)很重要。从一开始就使用它(而不是告诉自己以后会添加它) - 如果您发现自己在 JLabel 上调用 setText(),那么是时候坐下来调用 setName() 并在资源中添加一个条目了文件。如果您遵守纪律,JSR 296 使这件事变得非常容易。

    我认为现在就足够了 - 这是一个非常复杂的主题,有很多细微差别。在过去的 7 或 8 年里,我一直在研究那些行不通的事情——我一直在寻找更好的方法来做那些对我来说很有效的事情。

    关于java - 我在哪里可以找到针对 Web 开发人员的 Java Swing GUI 的优秀、简短、面向体系结构的介绍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1063891/

    相关文章:

    java - 适用于 Android 的 Zxing 条码匹配应用程序

    java - 在 java 中制作我的第一个项目

    java - 如何从 JVM 内存中清除明确的敏感数据?

    java - 有没有错误?

    java - 使应用层松散耦合

    architecture - 一个真正的领域模型 - 一个谬论?

    java - JSON 库返回 Java8 选项?

    java - MouseListener 第一次不起作用

    java - Selenium 驱动程序中的随机警报,我该如何处理?

    java - 无法更新图像图标