摇摆的GUI指南

时间:2010-02-25 20:20:42

标签: java user-interface swing

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

7 个答案:

答案 0 :(得分:34)

设计指南并没有完全遵循,因为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是单线程的,这对多线程应用程序意味着什么。
  • 了解SwingUtilities.invokeLater()的作用。
  • 永远不要使用SwingUtilities.invokeAndWait()。你这样做是错的。不要在事件编程中尝试编写同步代码。 (*有一些极端情况可以接受invokeAndWait(),但99%的情况下你不需要invokeAndWait())。
  • 如果你从头开始一个新项目,请跳过Swing。它已经过时了,它结束了。 Sun从来没有像服务器那样真正关心客户端。 Swing一直保持不佳,自首次撰写以来没有取得多大进展。 JavaFX还没有出现,并且遭受了很多Swing的祸害。我会说Apache Pivot。许多新想法和更好的设计以及活跃的社区。

答案 1 :(得分:5)

我已经写了一份推荐清单here

答案 2 :(得分:5)

在大型项目中,我会像这样分享应用程序:

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

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

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

编辑:如果你正在寻找教程或介绍,你可以开始here

答案 3 :(得分:5)

也许不完全是你想要的东西,但是看一看Java Look and Feel Design Guidelines

并不会有什么坏处

答案 4 :(得分:1)

您可以查看FEST背后的想法 - 摇摆测试框架。它的主要网站是here,项目已托管here

答案 5 :(得分:1)

您可以在Professional Java JDK6 Edition

的第4章中找到一些最佳做法

alt text

答案 6 :(得分:1)

我也有一些指导方针:

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

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

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

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

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

6)使用大量枚举

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

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

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

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

希望有所帮助。