我在哪里可以找到针对Web开发人员的Java Swing GUI的优秀,简短,面向架构的介绍?

Hen*_*ing 12 java architecture swing

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

几乎我发现的任何文档都深入探讨了每个Swing UI小部件如何工作和可以使用的细节,但所有示例只是直接从扩展的类中调用程序逻辑,例如,JPanel - 这似乎很奇怪而且没有良好的建筑.

如果它与IDE无关,那将是最好的,但如果这些事情发挥作用,应该说在整个项目中,我们已经使用了Eclipse,JFormdesigner和JGoodies.

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

Kev*_*Day 14

这是一个Java编程领域,其文档资料严重不足.正如您所提到的,从JFrame或JDialog扩展到开发GUI并不是一个好的设计实践,但您可以在示例代码中看到它.

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

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

因此,我无法为构建秋千应用程序的最佳实践提供任何明确的资源.但是我可以给你一些关于我发现我一遍又一遍使用的工具包和概念的指示.也许这些对你来说很有用.此外,如果有足够的人有兴趣讨论最佳实践,共享代码等...我有兴趣成为其中的一部分.

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

  1. 绑定 - 有许多库可以做到这一点(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启发的技术,将视图视为创建JPanels的构建器.基本模式是:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

我认为现在已经够了 - 这是一个非常复杂的主题,有很多细微之处.在过去的7到8年里,我一直在努力探索那些不起作用的事情 - 而且我不断寻找更好的方法去做那些对我有用的事情.