代码之家  ›  专栏  ›  技术社区  ›  Henning

我在哪里可以找到一个好的、简短的、面向体系结构的Java Swing GUI for web developerR简介?

  •  10
  • Henning  · 技术社区  · 15 年前

    我刚刚开始我的第一个JavaSwing项目(以前主要做基于web的应用程序),并试图了解如何通过分离MVC组件之间的关注点来构建适当的体系结构。

    我找到的任何文档都非常深入地介绍了每个Swing UI小部件的工作原理和使用方法,但所有示例都直接从一个扩展类调用程序逻辑,例如JPanel,这看起来很奇怪,也没有好的架构。

    5 回复  |  直到 15 年前
        1
  •  15
  •   Kevin Day    14 年前

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

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

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

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

    首先,如果要进行Swing开发,请使用一些绝对重要的库:

    1. 绑定——有许多库可以做到这一点(JGoodies,JSR295,它已经衍生到一个名为BetterBeans绑定(BBB)的开源项目中,Eclipse绑定框架)。我在几年前开始使用JGoodies,但现在我转而使用BBB,因为我发现它的方法更加直观。我不能强调绑定所允许的声明性编码方法的优点——它将真正彻底改变您的代码

    2. AppFramework(或者它的一些风格)——JSR296就是从这里开始的。正如我上面提到的,它有一些问题——如果您确实使用JSR296,我强烈建议您尽量避免使用作为框架核心的单例(而不是作为您实际需要的框架组件的注入源)。

    编辑 GUTS 在我们的项目中(这是一个基于Guice的应用程序框架——它从JSR296开始,但现在几乎没有什么共同点)。GUTS仍然是一个年轻的项目,但如果您正在考虑框架,那么值得一看。

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

    2. Mig布局-Mig布局管理器是最好的选择。我强烈建议不要使用IDEGUI构建器-学习MigLayout(最多需要几个小时),并手工编写代码。

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

    现在有一些概念:

    B.视图不是JPanel的子类。相反,我遵循JGoodies启发的技术,将视图视为创建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;
      }
    }
    

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

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

    我认为这就足够了——这是一个高度复杂的问题,有很多细微差别。在过去的7到8年里,我一直在为那些不起作用的事情绞尽脑汁,我也在不断地寻找更好的方法来做那些对我来说很好的事情。

        2
  •  1
  •   Thorbjørn Ravn Andersen    15 年前

    Java教程提供了一个Swing教程,它非常有助于理清概念。

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

        3
  •  1
  •   Reginaldo    15 年前
        4
  •  0
  •   David Rabinowitz    15 年前

    你可以试试这个 Spring Rich Client project . 我对spring投资组合的其他部分有很好的经验。

        5
  •  0
  •   Henning    15 年前

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

    我不确定我是否喜欢控制器本身实现ActionListener的想法——另一方面,如果不喜欢,我需要一个额外的类来实现这一点,这同样需要了解控制器并告诉他一些事情。。。

    也许问题在于,Swing组件如何与控制器通信有太多可能的选择,而乍一看没有一个是真正“正确的”。。。