【问题标题】:Where do I find a good, short, architecture-oriented introduction to Java Swing GUI for web developerrs?我在哪里可以找到面向 Web 开发人员的 Java Swing GUI 的优秀、简短、面向体系结构的介绍?
【发布时间】:2010-11-07 00:37:32
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java swing architecture


    【解决方案1】:

    Java 教程有一个 Swing 线索,非常有助于理清概念。

    如果您习惯于 Web 应用程序,您会发现 GUI 模型相当混乱,直到您明白这一点。

    http://java.sun.com/docs/books/tutorial/uiswing/

    【讨论】:

    • 当然我看到了 :) 但它属于提到的类别:告诉我关于每个小部件的很多细节(毫无疑问,这在某些时候会很好看,还有一些更有趣的东西在那里找到!),但我正在寻找正确的架构!
    【解决方案2】:

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

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

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

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

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

    1. Binding - 有许多库可以执行此操作(JGoodies、JSR295,它已衍生为一个名为 Better Beans Binding (BBB) 的开源项目、Eclipse 绑定框架)。几年前我开始使用 JGoodies,但我已经转向使用 BBB,因为我发现它的方法更直观。我无法强调绑定所允许的声明式编码方法的优势——它将真正彻底改变您的代码

    2. AppFramework(或其某种形式)- JSR 296 是从这里开始的地方。正如我上面提到的,它有一些问题 - 如果你确实使用 JSR296,我强烈建议你尽量避免使用作为框架核心的单例(除了作为注入框架组件的源之外)你实际上需要)。

    编辑 - 自从我写了这篇文章后,我就开始在我们的项目中使用GUTS(这是一个基于 Guice 的应用程序框架 - 它最初是 JSR 296,但几乎没有共同点现在有了它)。 GUTS 仍然是一个年轻的项目,但如果您正在考虑框架,则值得一看。

    1. GlazedLists - 如果你在 UI 中做任何涉及列表、表格或树的事情,你应该仔细看看 GlazedLists。这是一个令人难以置信的项目(不仅适用于 Swing 应用程序,而且它确实在那个领域大放异彩)

    2. 验证 - JGoodies 有一个非常好的验证库。学习它,使用它,与它合一。实时验证是现代 Swing 应用程序中极其重要的一部分。

    3. MigLayout - Mig 布局管理器是最好的。我强烈建议不要使用 IDE GUI 构建器的诱惑 - 学习 MigLayout(这将需要几个小时,顶部),并手动编写代码。

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

    现在一些概念:

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

    B.视图不是 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 支持 - 由该视图生成的一个面板中的更改将立即在由同一视图生成的另一个面板中可见。

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

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

    E.资源注入很重要。从一开始就使用它(而不是告诉自己稍后会添加它) - 如果您发现自己在 JLabel 上调用 setText(),那么是时候坐下来调用 setName(),并在资源中添加一个条目文件。如果您有纪律的话,JSR 296 可以让这很容易做到。

    我认为现在就足够了 - 这是一个非常复杂的主题,有很多细微差别。在过去的 7 或 8 年里,我一直在努力解决那些不起作用的事情——而且我一直在寻找更好的方法来做那些对我来说很好的事情。

    【讨论】:

    • 我想在这里提到的另一件事:我已经广泛研究了 Eclipse、NetBeans 和 Spring 富客户端平台。我的收获是,它们可能对某些类型的项目有用,但学习曲线很陡,如果你选择使用其中一个平台,你真的必须遵守他们的规则。
    • 扩展 JPanel(或任何 JComponent)有什么问题?例如,如果我有一个用于显示地图的面板,我将创建一个名为 MapPanel 的类,扩展 JPanel,并在面板上绘制地图。
    • 这种用法完全没有问题,Thomas - 我遇到的问题是人们对 JPanel 进行子类化以便他们可以向其中添加组件的场景(从 JFrame 或 JDialog 扩展是一个更好的例子 -我将编辑帖子以表明这一点)。在您的情况下,如果您将地图放置在 JScrollPane 中,然后将 JScrollPane 添加到面板中,那么我会说需要一种不同的方法。但是要创建一个真正的新 UI 组件,扩展 JPanel 是要走的路。
    • 感谢凯文,有很多东西要研究!我认为,如果我们要从头开始一个项目,eclipse/netbeans/spring 会很好——可能比 AppFramework 更胖一些。但由于我必须在现有代码库中添加一些东西(创建者自己不确定它的架构是否正确),所以我需要一些可以适应它的东西,并且仍然尽可能地进行正确设计。
    • 我听到了。使用 RCP 框架作为基线的想法真的很吸引人 - 但我第一次阅读如何使用 NetBeans 构建 RCP 应用程序让我感到恐惧(框架要求的代码气味数量是太棒了)。 App Framework 也有问题,但至少可以使用它“正确”构建应用程序。 Eclipse RCP 可能没问题,但单独部署是如此庞大,以至于我们无法走这条路。
    【解决方案3】:

    Martin Fowler 已开始 a development on his Patterns of Enterprise Application Architecture book 涵盖一些原书中未涵盖的模式,包括 GUI patterns

    虽然它的内容并非完全面向 Java,但它们非常有价值。

    【讨论】:

    • Fowler 的工作对我作为 GUI 开发人员的发展非常有帮助。强烈推荐一旦您达到可以将您对 GUI 开发的想法抽象到设计模式级别的程度。演示模型非常有用。
    【解决方案4】:

    你可以试试Spring Rich Client project。我对春季产品组合的其余部分有很好的体验。

    【讨论】:

    • 谢谢!我知道它,迟早会看的。但首先,我想从头开始学习如何正确地做到这一点,然后我必须将一些新功能集成到现有的代码库中(并最终在旅途中重构这个基础)。所以成熟的框架可能不是我现在可以使用的。
    【解决方案5】:

    还有一个非常基本、非常简单的方法来展示这方面的内容:

    http://www.macs.hw.ac.uk/guidebook/?name=Using%20The%20GUI&page=1

    我不确定我是否喜欢控制器本身实现 ActionListener 的想法 - 另一方面,如果不喜欢,我需要一个额外的类,它再次需要知道控制器和告诉他事情......

    也许问题在于 Swing 组件如何与控制器通信有很多可能的选择,但乍一看,它们都不是真正“正确”的......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 2014-07-23
      • 2010-10-15
      • 1970-01-01
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多