Java Swing开发的最佳实践是什么?


17

对该问题进行预研究时,我发现Internet上没有太多组织良好的有关Java Swing最佳实践的信息。因此,我想我将为Stack Exchange打造一个“伟大清单”提供帮助。

Java Swing开发的最佳实践是什么?您发现什么对您有用,为什么?


2
我在学校和Swing一起玩,那不是一个愉快的经历。整个事情看起来肿,不必要地复杂。最佳实践可能是使用其他东西。
罗伯特·哈维

1
@RobertHarvey“在学校玩”与交付生产软件相去甚远。我发现Swing可以以合理,合乎逻辑的方式完成它所需要的一切。

好吧,这样说:如果仅是一个学校项目就这么困难,那么在一个真正的项目上几乎很难想象。
罗伯特·哈维

1
@RobertHarvey的力量是有代价的……

只是一件重要的事情。Swing组件是可序列化的,并且有许多祖先。因此,它们在大多数情况下都无法继承。您应该考虑一些包装技术,尤其是当您具有不可序列化的状态时。如果从组件继承,则只需将其用作视图(在MVC或类似模式中)。
大卫·霍瓦特

Answers:


12

我只能回答对我有用的东西。其他评论者指出,Java GUI通常会落入不十分原生的外观和感觉的“怪异谷”中,我对此并不提出异议。

充分利用Action API。它使您可以更好地封装用户将执行的不同操作,并允许您更轻松地将它们连接到快捷方式,加速键,按钮和其他输入对象。

使用适当的布局管理器。GridBagLayout非常强大,但是我要说的是,如果没有过多的注释,它是无法维护的。当我在我维护的较旧的GUI应用程序上运行诸如Sonar之类的静态代码分析工具时,它总是指出大量的幻数,以使GridBags布局正确。我在GroupLayout上取得了很多成功,它避免了必须指定像素完美的对齐方式。

如果您认为您需要JDialog ...则可能不需要。就用户体验而言,对话框是可怕的-该应用程序决定将其用于每个菜单和表单,并以奇异的方式强制执行始终在最前面的规则。当我们实际上确实需要在菜单上发出警报时,这变成了维护的噩梦。提示使无法单击的对话框(因此无法取消的对话框)受挫。

在适当的地方使用SwingWorker而不是滚动自己的多线程。扩展SwingWorker并执行一些长期运行的任务非常容易,同时还可以将定期更新返回给GUI。考虑下载客户端更新。它会为您处理工作线程调度,并让您将下载百分比发布回视图,以便您可以更新ProgressBar或您拥有的东西。

根据我公认的有限经验,这就是我所能建议的。


2
JDialog很好-只要您将其用于对话框即可。
乔纳斯(Jonas)

1
我同意,如果您将它们用于绝对必须立即看到并采取行动的信息,则它们很好。但是大多数信息实际上并不需要那么多地破坏用户体验。那就是我的预选赛的重点。
汤姆G

@Jonas我认为关键是对话是一件坏事(无论是否实现对话JDialog)。
汤姆·哈顿

1
耦合有点令人讨厌,但是比编写自己的线程代码更好的IMO。我宁愿处理低级的代码,也不愿处理微妙的线程错误。
汤姆G

3
你可能想看看MigLayout - miglayout.com

4

我要说的第一件事就是不要直接对其进行处理。Swing(IMHO)中的布局系统非常糟糕,而试图从中使用任何实质性的应用程序都是一场噩梦。

我使用的许多替代布局管理器中的两个是MigLayout和MultiSplitPane布局。MigLayout是更通用的用途,它使您可以以简单,理智的方式想到的任何布局。MultiSplitPane更具体;我用它为GUI制作了一些简单的布局,这些布局没有太多复杂性。

编辑这不能代替swing。如果必须使用Swing,您仍然可以使用这些布局管理器,因为它们仅管理Swing,而不是替换它。


当然,更好的选择是不使用Swing。Swing令人敬畏,因为它使用起来很恐怖,看上去并不原生,而且运行缓慢。存在许多替代方案,它们从中学到了不该做的事情,例如Qt,SWT,甚至我认为是GTK。这些是解决Swing头痛的长期解决方案

编辑:正如@Torgamus勋爵所说,如果您被迫使用Swing,这些功能实际上将不可用。如果您打算在创建项目时使用这些最佳解决方案,而不是3/4或选择遗留应用程序时这样做。

我还想指出,大多数替代GUI都使用本机库,因此看起来像操作系统,然后又退回到Swing或其他一些Pure Java GUI。


4
非常感谢您的意见,但是“不要使用Swing”对最终遇到此问题的人没有帮助,因为他们由于某种原因而被迫使用Swing。
流行

@Lord这就是为什么我在建议QT和SWT之前建议替代布局管理器的原因。使用任何可能的路径。
TheLQ 2011年

“ Swing(IMHO)中的布局系统非常糟糕,试图从中使用任何实质性的应用程序都是一场噩梦。” 布局管理器通常来自AWT,而不是Swing。当然,有一些特定于Swing的版本,例如BoxLayout和GroupLayout。话虽如此,布局管理器是完全可选的……您可以像在.NET WinForms中一样为每个组件指定坐标(除了.NET有一个不错的GUI可以为您完成)。
Powerlord 2011年

3
看看MigLayout - miglayout.com

1
@TheLQ好吧,我同意Swing的文件管理器,那真的很愚蠢(在Mac OS X上也是如此)。无论如何,我只是使用AWT的文件管理器来解决此问题。即使应用程序的其余部分是使用Swing制作的,效果也很好。
stommestack 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.