手码GUI或使用gui-designer工具

时间:2009-03-08 14:56:41

标签: java c++ swing windows-forms-designer gui-designer

我想听到一些关于手工编写GUI的意见,就像使用Java或Qt和C ++一样,而不是使用gui设计工具? GUI设计器工具的示例是MFC GUI设计器,Qt设计器,Interface Builder(Apple)。

我曾经是手工编码的粉丝,但从最近的经验来看,我已经改变了。我用手编码看到的问题是编写GUI非常快速和灵活,但是一旦你需要对很久以前编写的GUI进行更改,这可能会非常困难。在大面板中找到正确的元素可能很困难。

第二个问题是,它很容易在GUI创建和布局代码中添加大量逻辑。我经常不得不接管维护很难重复使用的GUI代码,因为它的行为与它的外观和混合布局和行为混合在一起往往使得这个类非常庞大且难以理解。

使用GUI设计器工具可以在我的视图中强化外观和逻辑之间的分离。

11 个答案:

答案 0 :(得分:15)

总是手工编写GUI设计,其中没有标准(或事实上的标准)GUI标记语言(与Java一样) 。这样做的原因是我发现使用GUI构建器设计工具会将您绑定到使用特定的IDE。随着时间的推移,用于GUI设计和/或编写代码的最佳IDE将发生变化,每个开发人员都可以自由选择他们认为最适合的IDE

我现在工作的地方,我们有很多遗留的GUI,它们是使用Netbeans Matisse GUI构建器编写的(当时我的建议是:-)。这些现在几乎无法维护,因为所有开发人员都喜欢IntelliJ IDEAEclipse作为他们的IDE。让开发人员启动Netbeans只是为了修改GUI布局(人们不会保持Netbeans项目定义同步等)并不现实或可行。

另一点是写出GUI布局代码的总时间可能只占给定项目总开发工作量的5%。即使你自己编写代码需要两倍的时间,这也不会在宏观方案中转化太多的开销。这对于长期可维护性来说是一个很小的代价。

只要你清楚将GUI布局逻辑从业务逻辑中分离出来,我就不相信任何结果会受到影响。这里没有人再使用GUI构建器了!

答案 1 :(得分:6)

我是手工完成的,在应用程序内部重新设置面板并重新使用面板要容易得多(某些面板可能出现在多个位置)。

使用设计师在团队中工作时,艺术家应该使用GUI。

  

在大面板中找到合适的元素可能很困难。

??我从未见过。

答案 2 :(得分:4)

我强烈建议您使用界面构建器而不是手动编写GUI。正如在提到的问题中,它是一个更清晰的分离,一旦必须编辑某些东西,它就会容易得多。

Qt Designer使用此功能从.ui文件 1)创建一个类,但我认为不使用此功能是最好的方法,因为这会创建更多编码,根本不存在。从.ui文件创建窗口的速度问题可以忽略不计,因为窗口只需加载一次。

这是PyQt,但在C ++中可能有类似的东西:

class SelectDateDialog(QDialog):
    def __init__(self):
        QDialog.__init__(self)
        uic.loadUi("resources/SelectDate.ui", self)

基本上这与将所有UI代码包含在__init__()方法中具有相同的效果,但UI几乎完全与代码分离。

1) .ui文件是描述用户界面的XML文件

答案 3 :(得分:3)

有趣的是它已经反过来了。从Winforms的角度来看,设计师生成的代码非常嘈杂,可能只有四分之一或一半的属性设置非常必要。与设计师合作时,制作相当大的控件也更具诱惑力。在Winforms设计器中更改某些控件层次结构在我眼中是一场噩梦。

在我的上一个项目中,我创建了其他API,以声明的方式在表单,dockmanagers,菜单,工具栏等中设置分割器。这样他们将进一步强制分离关注点。

我还尝试更多地依赖自动布局功能,这些功能在WPF中确实更好,但在Windows窗体中也可以采用某种方式。

答案 4 :(得分:3)

我强烈建议你在OS X上使用Interface Builder。如果你想学习,手工做是很好的,但是你可以通过在实际项目中使用它来节省很多麻烦。它真的非常强大。

至于Java和C ++,它取决于你正在做什么以及在什么平台上。对于简单的应用程序,您可以永远不会看到UI代码。但是,对于复杂的应用程序和富客户端,通常需要手动执行一些代码。

答案 5 :(得分:2)

这取决于具体情况。我认为两者都有自己的位置,我通常采用混合方法。

GUI构建器总是有些东西不能做(例如在Interface Builder中将颜色设置为UIColor常量)。另一方面,大多数UI工作都非常普通(例如添加静态标签)。

我更喜欢在GUI构建器中执行普通的东西,以及代码中更有趣的东西。

另外,我偶尔也会手动编辑GUI构建器生成的XML(在我的例子中是Interface Builder和glade)。

答案 6 :(得分:2)

如果您正在设计包含大量条目表单和表格数据的业务应用程序,那么为UI编写代码比使用UI设计器更快,更易于维护。在这些类型的应用程序中,几乎不需要将一个元素精确地放置在屏幕上的预定义位置,而另一方面,有许多重复和设计约定可以简单地提取到单独的方法中。

以Eclipse或OpenOffice首选项对话框为例。每个都有很多类别和一系列不同的选项。如果你必须制作那么大的东西,手工设计每个屏幕是一项平凡的任务。更好的方法是编写代码,根据一些约定和默认值,从提供的域数据中即时生成UI元素。

我没有看到使用设计师如何促进更好的分离,也没有看到这种感知分离对任何事情都有帮助,因为你已经将业务逻辑排除在UI之外。

最后,如果您使用的是Java,请务必查看MigLayout。它适用于Swing和SWT,它的语法非常简洁明了,它的调试模式非常有用。

答案 7 :(得分:1)

我倾向于认为正确的答案取决于目标平台的文化。在OS X上,Interface Builder是工具链中不可或缺的一部分,很难避免它。

在Java(awt或swing)中,反之亦然。没有工具链支持。

真的,你可以说出的方式是工具产生输出的方式。 Interface Builder生成.nib格式文件,这些文件特定于Cocoa在屏幕上放置控件的方式。它理解什么是接口标记格式。 Java没有类似的概念。一切都是编译类,因此更难以获得方便的结果。

GTK +与林间空地相结合,似乎在两者之间取得了合理的平衡。

答案 8 :(得分:1)

没有什么可以阻止混合这两种方法。我经常在GUI设计器中制作表单的主要布局(因为它很快,你看到你在做什么),然后放置一个或多个面板,然后填充代码。当GUI必须适应特定情况时,这尤其有用 - 例如,如果GUI必须根据连接的硬件进行更改。

在任何情况下,最重要的是确保GUI和应用程序逻辑分开。

答案 9 :(得分:0)

我对此的看法:   1.手工编码的GUI代码更具可重用性   2.设计师的布局问题更简单

答案 10 :(得分:0)

如果您想要UI中包含一些非标准功能,手动编码可能会很好。您有更多的灵活性,但是您需要投入更多的时间来创建一个好的界面,因为Java / C ++语言并不意味着针对UI设计。

如果您有修订控件,可以查看更改历史记录,使用二进制格式设计无法完成的操作,或者不是RCS友好的xml格式。

今天,大多数可视化设计UI的工具都缺少一些功能。它们不够灵活,有些功能只能通过编码来实现。此外,在某些情况下,生成的代码并不是真正的人性化,如果您手动修改,您可能无法再继续使用设计器。

但如果设计简单,那么设计可以真正节省时间,我们希望设计师将来能够得到改进,但我不会保持广度。

我的结论是,如果你今天需要灵活性,你必须手工编写界面,如果你想要简单快速的东西,那么设计师是最好的选择。

也许将来设计师会更强大,或者可能会有专门用于UI设计的新语言,这些语言更适合在C ++ / Java中使用,例如XUL或XAML。