摇摆的GUI指南

是否有解释摇摆的GUI设计的资源? 像最佳实践等。

设计指南并没有完全遵循,因为Swing可以在很多不同的平台上运行。 很久以前Sun写了一些,但从未改变它们,所以如果你认为它会有所帮助我会说它。 这里有一些关于做摇摆发展的实用知识。

  • 永远不要使用GridBagLayout。 抓住TableLayout。 它从根本上简化了Swing UI的布局。 GridBagLayout是魔鬼。
  • 不要过度嵌入组件只是为了获得正确的布局(即嵌入式BoxLayout等)。 有关如何执行此操作,请参阅第1点。 屏幕上有组件存在性能问题。
  • 沿MVC线分离您的程序。 Swing具有视图和模型分离,但是在大型程序中,View(即Swing组件的子类)变成了伪造的视图/控制器,这使得复制和维护变得复杂。 它快速变成意大利面条代码。 打破习惯并创建一个不扩展Swing的Controller类。 模型(无摆动)也是如此。 Controller实例化高级视图类,并将自身连接为视图的侦听器。
  • 仅使用简单面板简化弹出对话框。 不要将JDialog子类化。 创建一个可重用的对话框类,它包装了一个可以像JOptionPane这样使用的面板。 您的面板不会仅限于对话框,可以重复使用。 当你以这种方式工作时,这很容易。
  • 避免使用actionlistener /命令。 这是旧垃圾,不是很可重复使用。 使用AbstractAction(anon类是你的选择,我没有问题)。 AbstractAction封装了文本,图标,mneumonics,加速器,可重复使用按钮,弹出窗口,菜单,手柄切换启用/禁用状态,可以在多个组件之间共享,它也是InputMap / ActionMaps将键盘笔划映射到动作的基础。 ActionMaps为您提供重复使用的电力。
  • 最好必须向控制器查看调度事件。 我不是在谈论鼠标/键盘垃圾,而是高级事件。 像NewUserEvent,AddUserEvent,DeleteUserEvent等。让您的控制器监听这些高级业务事件。 这将通过保持视图(我应该使用表,列表,树或其他什么?)与应用程序流分离的关注点来促进封装。 控制器不关心用户是否单击了按钮,菜单或复选框。
  • 事件不仅仅适用于Controller。 Swing是事件编程。 您的模型将在SwingThread或后台执行操作。 将事件调度回控制器是一种非常简单的方法,可以让它响应模型层中可能正在使用线程执行工作的事情。
  • 了解Swing的线程规则! 你很惊讶很少有人真正理解Swing是单线程的,这对于multithreading应用程序意味着什么。
  • 了解SwingUtilities.invokeLater()的作用。
  • 永远不要使用SwingUtilities.invokeAndWait()。 你这样做是错的。 不要在事件编程中尝试编写同步代码。 (*有一些极端情况可以接受invokeAndWait(),但99%的情况下你不需要invokeAndWait())。
  • 如果您从头开始一个新项目,请跳过Swing。 它已经老了,结束了。 Sun从来没有像服务器那样真正关心客户端。 Swing一直保持不佳,自首次撰写以来没有取得多大进展。 JavaFX还没有出现,并且遭受了很多Swing的弊端。 我想看看Apache Pivot 。 许多新想法和更好的设计以及活跃的社区。

我在这里写了一份推荐清单。

在较大的摇摆项目中,我像这样分享应用程序:

  • 每个GUI元素都有一个类,如JPanel,JDialog等。

  • 为每个屏幕使用单独的包,特别是如果您必须实现自定义的TableModel或其他复杂的数据结构

  • 不要使用匿名和内部类,而是实现ActionListener并在那里检查ActionEvent.getActionCommand()。

编辑:如果您正在寻找教程或介绍,您可以从这里开始

也许不完全是你想要的东西,但是看看Java外观设计指南并不会有什么坏处

你可以检查FEST背后的想法 – 一个摆动测试框架。 它的主要网站在这里 ,项目在这里托管

您可以在Professional Java JDK6 Edition的第4章中找到一些最佳实践

替代文字

我也有一些指导方针:

1)使用Maven并将您的应用程序分成模块(视图,控制器,服务,持久性,实用程序,模型)。 确保将Swing组件和依赖项仅放在视图包中,因此如果您希望某天更改视图框架,则可以重新实现视图模块,但您可以保留业务逻辑,控制器等等。

2)使用GridBagLayout因为它非常灵活且最易配置

3)使用SwingTemplate(如果你愿意,我可以给你一个例子)

4)创建一个创建组件的SwingFactory,这样就可以减少代码行数,因为JFrames orso打算成为非常大的类…

5)让视图(JFrame,JDialog等)依赖于控制器。 仅在JFrame上进行validation输入,但随后将参数传递给控制器​​。 他们将决定触发哪些业务逻辑(服务,处理器等)。

6)使用大量枚举

7)始终考虑您的应用程序如何更改或如何维护。 因此,始终使用针对接口或抽象类的代码。 (想想抽象)

8)在应用程序中使用设计模式,因为它们提供了代码的可靠性和可维护性。 例如,制作所有控制器,服务,dao的单例类。 制作工厂(swingfactory,…),这样你就不得不一遍又一遍地编写更少的代码….使用观察者可以自动处理动作。

9)测试您的应用:在:TDD(测试驱动设计)或DDT(设计驱动测试)之间做出选择

10)永远不要在JFrame上放置任何业务逻辑,因为它很丑陋而且不是模型 – 视图 – 控制器设计。 JFrames对如何处理数据不感兴趣。

希望有所帮助。