Swing LayoutManagers是否足够?

时间:2008-11-25 20:54:30

标签: java swing layout

我只需要在我到达之前写入的应用程序中添加一个复选框,这比以前更困难,因为应用程序使用了一些第三方LayoutManager尝试伪绝对,类似网格定位。 API很糟糕,它需要位置指定字符串,这些字符串是逗号分隔的两个,四个或六个参数列表(我仍然不知道为什么会这样变化),我宁愿让LayoutManager处理很多这个无论如何,笨拙的工作。我总是觉得允许Swing定位事物本身导致了比我能产生的更好的组织。我对CGI应用程序也有同样的感觉,除了偶尔将复选框或带有表格的无线电盒子分组之外我几乎只是让浏览器流动并包装用户想要的东西。

Swing包含的LayoutManager实现是否足够,或者是否真的有必要采用这种绝对控制来强制布局完全符合您的要求(并为您做出更多的决策)?

9 个答案:

答案 0 :(得分:6)

这种情况好多了。我会说三个最常见的非标准布局管理器是:

  • JGoodies FormLayout
  • TableLayout
  • MigLayout

最后两个非常相似,但MigLayout稍晚出现,将来会成为JDK的一部分。我会说这三个中的任何一个都有“标准”足以相当舒服地使用,但MigLayout很可能会胜出现在它将成为Swing本身的一部分。

所以此刻,我会说不。一旦MigLayout在JDK中,是的。

答案 1 :(得分:4)

就我个人而言,我认为Java布局管理概念是自切片面包以来最酷的事情;对于可调整大小的窗口至关重要 - 只需查看Windows中所有不可调整大小的窗口,以表明拥有抽象布局管理器是一个好主意。

也就是说,Java中的布局管理器足够,但需要相当数量的嵌套才能到达您需要的位置。这种嵌套使得改变事情变得很麻烦。查看BoxLayout和BorderLayout作为您的主食;仅使用GridBagLayout作为最后的手段。

您最好的选择是采用适当的面向表格的布局来最小化嵌套;其他人已经提出了几点,所以我不会重申。我rolled my own因为我想要基于字符串的约束和一个小小的足迹,但是否则我很受TableLayout的诱惑;如果分发大小不是对象,你绝对必须看看jGoodies提供的小部件和布局(我认为是免费的,但也许仅用于非商业用途?)

我通常会为窗口使用表格布局,有时最终只会嵌套,并且通常只有一个级别用于相关组件的运行,比如三个框用于电话号码,两个标签之间用短划线分隔。我发现我的窗户是高度可维护的,并且很容易添加到它们并改变它们。

PS:避免像瘟疫这样的绝对定位

答案 2 :(得分:3)

Swing的布局管理器通常足以完成您要做的任何事情。在“最差”,你将不得不使用完整的GridBagLayout并使用坐标自己定位每个组件。从您的问题来看,听起来您的公司已经编写了一个封面,允许您使用一些奇怪的输入方案添加组件。我通常建议不要创建一个新的布局管理器,除非你能真正解释内置管理器没有做你需要它做的事情,也不能轻易地连接到你需要的地方。

答案 3 :(得分:3)

根据我的经验,它们足以让你准备好做一些筑巢(在某些情况下很多筑巢!)

无论哪种方式,我总是发现布局经理比他们的价值更麻烦。

答案 4 :(得分:1)

我从未成为Swing布局管理员的忠实粉丝,但是我从很多Motif做到了Swing。我不确定它是什么,但在我看来并不像Swing有能力将低嵌套的东西“推出”并迫使高于它的东西足够大以适应它们。此外,我是XmForm的忠实粉丝,在Swing中没有什么比这更好的了。

也就是说,Swing中有90%的时间使用了一堆嵌套的盒子 - 通常是垂直盒子里的水平盒子里的垂直盒子。有时候我需要更多的控制权,而且我为GridBagLayout制作了手册并且不寒而栗。

答案 5 :(得分:1)

根据您的说明,您可能正在使用TableLayout。如果是这样,我发现它在很多方面都优于标准布局管理器。如果是TableLayout,请尝试阅读文档,然后您将了解为什么有时会有不同数量的定位参数。 TableLayout还允许您以不同的方式设置这些参数,而不使用字符串。

答案 6 :(得分:0)

除了上面提到的3个第三方布局管理器之外,您可能想尝试一下DesignGridLayout,它虽然没有MigLayout那么强大,但是更容易使用,并且很难设计出错误的表单。

免责声明:我是DesignGridLayout的作者之一,但我真的相信这是一个很好的LayoutManager,与Swing默认的相比,还有其他第三方布局,有点太复杂了。

答案 7 :(得分:0)

我一直认为GridBagLayout是一个非常强大的LayoutManager。不幸的是,掌握它的学习曲线可能有点过于陡峭。我的第一份工作不允许我们使用任何GUI构建器,因此所有GUI代码都是手写的。我一直觉得这是学习GridBagLayout的最好方法,让你的手弄脏。如今,我大部分时间都懒惰,我主要使用NetBeans,但我仍然觉得不需要考虑其他LayoutManagers,因为GridBagLayout可以做任何事情。

对我来说,网格也是一种非常好的布局方式。以这种方式组织布局并根据行和列来考虑它是有意义的。

答案 8 :(得分:0)

我几年没有做任何Swing工作,但布局管理器是我在尝试编写网页时最想念的事情之一。我们使用GridBagLayout做了很多工作,特别是对于更复杂的对话框,一旦掌握了相对容易使用 - 当屏幕时。当不得不修改GUI时,总是会出现痛苦,表面看起来很简单会花费大量的时间来完成。

我被介绍给Abeille,这是一个GUI表单设计工具,虽然不完美,但您可以在几分钟内构建具有专业外观结果的屏幕,尤其是在与JGoodies结合使用时。它包括一个代码生成器或输出为二进制格式(我认为它包括以后的XML),这是我的首选选项。然后,“构建”屏幕的代码如下所示:

FormPanel panel = new FormPanel( "myDialog.jfrm" );
add(panel);

您可以挂钩表单上的控件以获取动作侦听器,并且当使用MVC模式时,会导致一些非常干净的视图代码。最大的好处在于进行更改,因为表单可以加载到编辑器中,快速更改并保存而不会更改代码。

(我与Abeille无关,只是一个大粉丝)