我刚刚开始我的第一个Java Swing项目(之前主要是做基于web的应用程序),并试图了解如何在MVC组件之间分离关注点的情况下构建适当的体系结构。
我找到的几乎所有文档都非常深入地介绍了每个Swing UI小部件的工作原理和使用方法,但所有示例都只是直接从扩展了JPanel的类中调用程序逻辑--这看起来很奇怪,也不是很好的架构。
如果这是独立于集成开发环境的,那就更好了,但如果这样的事情开始发挥作用,应该说在整个项目中,我们已经使用了Eclipse、JFormdesigner和JGoodies。
我还看到JSR296定义了一个框架,似乎解决了我所关心的问题。我应该只使用实现它的东西吗?
发布于 2009-06-30 14:51:59
这是一个文档严重不足的Java编程领域。正如您所提到的,从JFrame或JDialog扩展来开发图形用户界面并不是一种好的设计实践,但是在示例代码中到处都可以看到它。
JSR296是一个有用的起点,但它的体系结构存在一些严重的问题。我确实使用JSR 296,但我有自己的风格,并且必须始终解决框架设计引入的问题。
我一直认为应该有一个讨论组/wiki/一些专注于这个主题的东西。到目前为止,我发现各种富客户端库的listserv都很有用,但并不全面。在我的空闲时间,可以考虑开始做一些事情:-)
因此,我不能为构建swing应用程序的最佳实践提供任何权威的资源。但是我可以给你一些我发现我反复使用的工具包和概念的指针。也许这些在你开始的时候会对你有用。此外,如果有足够多的人对讨论最佳实践、共享代码等感兴趣……我很有兴趣成为其中的一员。
首先,如果您要进行Swing开发,则需要一些绝对关键的库:
Eclipse --有很多这样的库(JGoodies、JSR295,它已经衍生成一个叫做Better Beans Binding的开源项目,还有 binding framework)。我几年前就开始使用JGoodies了,但后来我转而使用BBB,因为我发现它的方法更直观。我不能强调绑定所允许的声明性编码方法的优点-它将真正彻底改变您的code
编辑-自从我写了这篇文章,我就开始在我们的项目中使用GUTS (这是一个基于Guice的应用程序框架-它最初是JSR296,但现在与它几乎没有什么共同点)。GUTS仍然是一个年轻的项目,但如果你正在考虑框架,那么它值得一看。
所以在我的书中,这些是关键的,绝对必须拥有的库。
下面是一些概念:
A. Presentation Model - Martin Fowler有很多关于这个设计模式的信息。总之,它将GUI级别的行为与表示分离开来。如果你习惯了MVC,Presentation Model又增加了一层分离,这对“实时”UI非常重要。我的所有视图都有相应的表示模型支持。最终的结果是视图代码非常非常简单--集中在两件事上: 1.布局,2.将视图组件绑定到表示模型。就这样。
视图不是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;
}
}这种方法,经过严格的遵循,可以极快地开发出易于维护的UI。请注意,我们可以使用给定的视图来构造多个JPanels,它们都由相同的PresentationModel支持-由视图生成的一个面板中的更改将立即在由相同视图生成的另一个面板中可见。
C.使用操作,而不是事件处理程序。JSR 296实际上在使操作易于创建和使用方面做得很好。
在EDT上进行长时间运行的操作(甚至需要100毫秒)。JSR 296的Task支持使得这一点变得相当简单--但是当涉及到异常处理时,JSR 296的Task system中有许多陷阱。如果您的属性更改反过来导致长时间运行的事件,请务必仔细考虑这些更改将在哪个线程上发生。使用任务对于您进行开发的方式来说是一个很大的改变,但对于任何真正的Swing应用程序来说,这都是一个非常重要的领域--花点时间来学习它。
E.资源注入很重要。从头开始使用它(而不是告诉自己以后再添加它)-如果您发现自己在JLabel上调用setText(),那么是时候坐下来调用setName()了,并向资源文件中添加一个条目。JSR 296让这件事变得非常容易,如果你对它很严格的话。
我认为现在已经足够了-这是一个非常复杂的主题,有很多细微差别。在过去的七八年里,我一直在用头去研究那些不起作用的事情--我一直在寻找更好的方法来做那些对我来说很好的事情。
发布于 2009-06-30 14:28:55
Java教程中有一篇Swing教程,它非常有助于理清概念。
如果你习惯了web应用,你会发现GUI模型相当混乱,直到你明白了这一点。
http://java.sun.com/docs/books/tutorial/uiswing/
发布于 2009-06-30 14:52:34
Martin Fowler已经开始了a development on his Patterns of Enterprise Application Architecture book ,涵盖了一些在原著中没有涉及的模式,包括GUI patterns。
虽然它的内容并不完全是面向Java的,但它们非常有价值。
https://stackoverflow.com/questions/1063891
复制相似问题