Java,使用GUI构建工具还是手写代码?

28

我们公司的软件有很多表单,迄今为止我们是用手写代码(MVC方式)。

我们正在考虑开始使用GUI构建器。

使用构建器存在一些问题:

  1. 部分代码不易于阅读
  2. 部分代码不易于编辑
  3. 以后编辑代码将更困难。
  4. 我们将不得不继续使用构建器,即使我们想要替换构建器或手写代码,而且没有人能保证该工具在未来可用和受支持。

我想从别人的经验中学习:

  • 您是否建议使用工具,还是应该继续手写代码?
  • 哪个构建器更好?
  • 他如何解决这些问题?(还有其他问题吗?)
16个回答

17

如果只需要制作几个表单,我建议使用构建器。这样可以更快完成。然而,如果您有很多需要长期维护的表单,我建议不要使用构建器。因为你花费在阅读代码和维护上的时间比初始设计时间要长得多。因此,虽然构建器可以在初始阶段节省时间,但它会使代码阅读和维护变得更加困难。此外,即使是从一个表单复制粘贴到另一个表单中,代码的重用也更加困难。

我不知道您是指网络应用程序还是桌面应用程序,但通常我没有找到一个能够产生优美输出的Java Gui构建器。例如,Netbeans Swing生成的代码非常混乱。也许,如果有一个好的构建器可用,我会改变我的想法。我使用Visual Studio的表单设计器没有问题 - 它可以生成易于阅读和理解的漂亮代码。

对于桌面应用程序,请看看MiGLayout。这是一个布局管理器,不是构建器,适用于Swing和SWT,可以使您的工作更加轻松。


3
我同意,NetBeans Swing 代码让我头疼。 - Jakob Cosoroaba
1
为什么Java没有Visual Basic或PureBasic的GUI设计思路呢? - user285594

10

通过使用一个好的构建工具,开发速度会更快。

你对无法修改代码的焦虑可能是因为你把很多逻辑放在了视图中,这是不应该的。实际上,这种改变可以帮助你将逻辑从视图中移出来,这样就可以在不破坏代码的情况下更改可视化元素。

关于“难以阅读”,你应该考虑使用更好的 GUI 生成器。我听说过 NetBeans 只有积极的评价,而我使用的 IntelliJ GUI 构建器的代码非常干净。

在这两个构建工具中,源代码都是可读和可编辑的,但只适用于小的调整。对于大的调整,最好使用 GUI 构建工具。

我认为,如果只有少量表单,手动进行没有问题,但是由于你刚才提到有“很多”,使用这些工具将是最有益的。


7
这是我的经验:
我从来不喜欢GUI构建器生成的代码。至少,在VB世界中,每个人(几乎)都会使用相同的IDE来构建应用程序。在Java中,人们使用多个IDE,有些人还使用VIM和记事本。而且所有IDE不会生成相同类型的代码。另一个问题是,它们通常不理解其他IDE生成的代码。所以回答你的第一个问题,我不推荐使用
你的下一个问题:哪个构建器更好?上次我用的时候,Netbeans比我试过的大多数构建器都要好。
如果您必须使用GUI构建器,因为需要更快地开发应用程序,请确保您的所有团队成员都使用相同的构建器。最好征求他们的意见,否则他们的眼睛会因IDE生成的源代码而受到伤害。
让我们知道你的决定!

关于Visual Studio中的VB/C# GUI编辑器,当您拖动控件时,它所做的只是设置左、上、宽度和高度属性。而Java GUI编辑器则倾向于使用LayoutManagers(我在看你,NetBeans)。另外,您可以通过查看表单的设计文件来查看VS表单编辑器输出的代码。 - Powerlord

5
我过去3年半的所有项目都使用Netbeans的Java Swing GUI Builder(Matisse)。我已经读了很多人对GUI Builder的抱怨,即使是最有经验的程序员也会责骂任何暗示使用GUI Builder的人。但这是我的经验:
  1. 不可编辑的代码从来不需要编辑。实际上,GUI Builder为您的GUI提供一个框架。您可以使用编辑器拖放、调整大小和约束组件,但表格的内容、下拉列表框中的内容等都需要在后端处理。GUI Builder允许您专注于此,同时确保外观漂亮且位置正确。
  2. 所见即所得一直更具生产力。文字处理器就是这方面的证明。人们会告诉你:“您不需要经常编辑GUI代码,因此如果它节省时间,那么它节省的时间并不多。”但这种说法非常相对。当您在一个软件环境中工作,该环境的流程模型由于业务模型变化而需要不断更新时,这种说法就是假的。此外,大多数时间都花在英文论文的内容上,不是吗?那么这个论点会说所见即所得的文字处理器并不能节省您太多时间,这样的说法会被置之不理,因为没有人想手动编写论文的外观和感觉。
  3. 没有手写GUI代码做不到的事情,而我曾经花了几个小时去解决手写GUI代码中的小问题,而在GUI Builder中只需要1分钟。
特别是Netbeans的GUI builder经过多年的改进已经变得更好了。它是一个很好的程序,也是一种用于快速构建功能丰富、美观界面的好方法。我强烈推荐使用良好的GUI Builder,尤其是Netbeans的。这就是我的说法。
不,我不为他们工作。

1
这取决于你在做什么。对于一篇文章来说,Markdown 可能比所见即所得编辑器更快,因为你不会被格式干扰。此外,你可以使用自己选择的编辑器(以及所有其他工具和文本差异),并且使用纯文本。同样,对于复杂的公式,使用 LaTeX(与你喜欢的文本编辑器)可能比所见即所得编辑器更快。我的经验是,使用 GUI 构建器让 MigLayout 处理所有事情比用鼠标摆弄要快得多。特别是当 GUI 不断发展时。 - maaartinus
1
事实上,写这篇文章时,我还没有使用过MigLayout,但自从写完这篇文章后,我已经使用了。现在我用过了,比以往更坚定了。MigLayout是非常出色的,极其适用于动态GUI(根据条件需要改变的接口),并且显然是最好的手工编码布局管理器......但对于静态GUI,GroupLayout和Netbeans编辑器要优秀得多。我希望人们能给它更多的机会。 - ryvantage

5
我建议避免使用GUI构建器。根据我的经验(如Matisse),您最终会花费与手动编写GUI相同甚至更多的时间来使用构建器编写GUI。这是因为需要尝试阅读生成的代码并进行清理以进行更改。此外,如果您手动编写GUI,则必须了解代码以编写GUI,这将帮助您随着时间的推移变得更加熟练,您将更快地编写GUI,并且手写它们的速度会更快。随着时间的推移,您还可以开发组件库,以实现您多次使用的GUI功能。我建议不要使用构建器。优秀的开发人员将在任何时候都能击败平均水平的开发人员。

3
如果您要构建的表单不太复杂,那么您可以看一下DesignGridLayout,它是一个带有流畅API的Swing LayoutManager,使得编写表单代码非常容易,并且易于阅读(并且易于维护,我指的是需要修改时)并通过代码可视化表单。
使用DesignGridLayout,表单中的每一行组件都是一行代码。 没有XML,完全编译时安全。 没有硬编码的间距值,对齐... DesignGridLayout为您处理所有这些。
短学习曲线,布局表单与GUI设计师一样快!
从我大约两年前发现它开始,我就一直在专门使用它(由于可怕的生成代码,我一直对GUI设计师过敏)。这就是我8个月前接手项目的原因,因为我想充分发挥它的潜力。

有关DesignGridLayout的最新消息吗?我看不到任何未解决的错误(很好!),但也几乎没有最近的更改。 - maaartinus
@maartinus 可能是因为我现在认为它已经“足够好了”,而且我不知道该怎么做才能让它更好(但欢迎提出RFE建议)。因此,目前我只在收到问题或错误报告时才会对DesignGridLayout进行工作。 - jfpoilpret

2
我们使用手工完成,但是利用一个库(JGoodies Forms)来帮助我们进行布局等操作。此外,我们还使用一组预定义的组件来插入我们的用户界面(Jide)。对我们来说运行得很好。

2

我多年来使用过许多GUI设计工具(用于不同的编程语言):Delphi、Visual Studio、JBuilder和Netbeans。

它们产生的代码质量和数量都很重要。Delphi非常出色,相对于窗体大小,它产生的代码量很小,易于理解,并且双向工具使您可以有信心地更改生成的代码。这得益于一个简单易懂的GUI库。VS则会产生大量代码,您可能会害怕更改它。

Java的问题部分在于语言本身,没有委托或闭包,因此基于事件的代码可能会快速变得杂乱无章。

我通常会使用Netbeans Matisse来创建简单的东西,一旦自信,就手动编写它们。对于复杂的东西,最好进行规划和手动编码,以便定义好您的模型。

如果您构建自己的GUI组件库并将其重复使用,则会有所帮助。这适用于所有带有GUI库的编程语言。


我想知道为什么你认为必须使用类(而不是闭包)是个问题。这只意味着每个监听器多两行代码,但是由于Delphi语法的限制,你不觉得会失去很多吗?(我不熟悉最近的版本,但是像无法在一个地方声明和初始化变量这样的事情,在我看来是个纯粹的灾难)。 - maaartinus
1
我并没有说使用类是一个问题(对吧?)。不过,我期待Java 8的到来,并且在某些地方让我的代码更加简洁。有时候将事件处理程序提取到单独的类中是有意义的,但也有时候不是。Pascal现在看起来已经过时了,因为它坚持要求预声明。 - Fortyrunner

2

对于有大量简单表单的系统,我倾向于采用XML方法:

  • 为每个表单定义XML文件和任何工作流程的信息
  • 创建XSLT以生成Java / XHTML / 网页等代码,在桌面PC / 移动设备/ Web上运行表单
  • 还要创建XSLT以生成源代码数据对象等。

您可以使用XForms及其实现,但通常我在工作场所中的经验是,购买解决方案需要比构建自己的简单XSLT更长的时间。如果表单中没有太多专业小部件,则通常需要一周左右即可使所有内容正常运行。如果您制作自己的代码生成器,则可以完全控制整个过程。如果您发现希望将所有表单从垂直滚动更改为以列形式呈现,则只需更改一个位置,而不是更改每个表单的实现(尽管您可以使用Java中的框架来将表单信息从表现形式中抽象出来,但它不适合这种申明性编程)。


3
直接在Java中使用流畅接口是一个更好的选择。即使它在某些方面不如Smalltalk,但在代码中提取用户界面抽象并消除重复要比Smalltalk容易得多。 - Stephan Eggermont

1

就我个人而言,我喜欢将 GUI 布局与代码分离(否则你就会遇到刚才提到的问题)。这也似乎是一种趋势:Microsoft 有他们的 XAML,你会听到不同的 MVC 视图引擎等等。

为什么不使用基于 XML 的 GUI 设计呢? 你可以尝试一下 JFormDesigner 这样的工具,它可以处理 XML 和代码生成的布局。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接