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

我在哪里可以找到面向web开发人员的Java Swing GUI的好的、简短的、面向架构的介绍?

  •  12
  • Henning  · 技术社区  · 16 年前

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

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

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

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

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

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

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

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

    编辑 GUTS 在我们的项目中(这是一个基于Guice的应用程序框架,它最初是JSR 296,但现在与它几乎没有共同之处)。GUTS仍然是一个年轻的项目,但如果你正在考虑框架,它值得一看。

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

    现在介绍一些概念:

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

    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;
      }
    }
    

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

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

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

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

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

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

    如果你习惯于web应用程序,在你弄清楚之前,你会发现GUI模型相当令人困惑。

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

        3
  •  1
  •   Reginaldo    16 年前

    马丁·福勒已经开始 a development on his Patterns of Enterprise Application Architecture book 涵盖了原书中未涉及的一些模式,包括 GUI patterns .

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

        4
  •  0
  •   David Rabinowitz    16 年前

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