您推荐哪种 Swing 布局? [关闭]

Posted

技术标签:

【中文标题】您推荐哪种 Swing 布局? [关闭]【英文标题】:Which Swing layout(s) do you recommend? [closed] 【发布时间】:2010-12-22 09:23:31 【问题描述】:

仅 Java 库中就有 8 个布局管理器,然后还有一堆 3rd 方产品。

前几天,我尝试使用 SpringLayout 并且...嗯,它不适合我。见我的other question。所以...如果您要设计一个 Swing 应用程序,并且您希望您的布局就这样,那么您首选的布局管理器是什么?有什么有趣/有用的经验可以联系吗?

更新:是的,我知道不同的 LM 适合不同的布局。但我希望你们中的大多数人在您所做的大多数事情上都使用 1、2 或 3,或者您发誓只有一个用途广泛的单品,您不需要其他任何东西。有了足够多的响应,我希望看到类似钟形曲线的东西,在 GridBagLayout 或 MigLayout(例如)上有一个峰值,以及一些使用(比如)BoxLayout 或 FlowLayout 的落后者的长尾。

希望回复的分布能够揭示人们最常使用什么来完成工作

的一些趋势

更新和总结

好的,经过将近 2 天的时间,MiGLayout 绝对领先!它的粉丝会很高兴听到这个布局即将进入“官方”库。

GroupLayout、FormsLayout 和 TableLayout 是相对较新的,并没有得到太多的曝光。也许其他人会像我一样惊讶地发现他们。

【问题讨论】:

【参考方案1】:

MiGLayout,毫无疑问。老实说,它是我所知道的唯一一个有意义的 Swing 布局管理器。

核心 JDK 中有 8 个布局管理器这一事实本身就是一个好迹象,表明 Swing 的创建者完全不知道他们要做什么。这并不是要破坏 Swing 的其余部分——它是一个很好的 GUI 工具包,除了布局管理器。

【讨论】:

一个接口有八个实现并不是软弱的表现! (虽然不能保证没有不相关的弱点。) -1 不同意 100%。用于不同目的的不同布局管理器,可以组合起来做几乎任何事情。这没什么不好, 就像不同的机器指令用于不同的目的,并且可以组合起来做几乎任何事情。这并没有错,但我宁愿使用更高级的语言以更少的努力达到同样的效果。 我和 Joonas 在一起。这些布局看起来像是建立在随着时间的推移而获得的经验之上。这并没有错,但这意味着一些较旧的版本没有它们应有的用途。 在与每一个“默认”布局进行了大约 30 分钟的斗争后,我在 Google 上搜索并找到了这个问题。 +1 史诗般的推荐,我在大约 3 秒内选择了 MiGLayout(相比之下,30 分钟仍未了解任何默认布局......)【参考方案2】:

所有这些,组合在一起。这就是重点。每个布局管理器都满足不同的要求,通过使用不同的布局管理器嵌套面板,您几乎可以实现任何目标。

GridBagLayoutGroupLayout(以及许多第3 方)这样的“在一个面板中完成所有操作”布局管理器占有一席之地,主要是当您需要布局不同部分的组件对齐时,一个大的布局,它们通常会导致一个巨大的、难以处理的混乱。

【讨论】:

【参考方案3】:

这取决于您要创建的 GUI 类型。您可能只使用一种或两种简单布局,或者您可能需要使用更高级的布局。我的整体布局管理器使用可能会分解成这样,尽管它会因项目而异:

65% GridBagLayout - 一种可以完成任务的布局,无论您需要做什么。 15% Box/BoxLayout - 非常适合快速轻松地将几个组件粘在一起。 12% BorderLayout - 适合将按钮面板或信息面板附加到内容面板。我几乎总是使用它向 JFrame 添加内容。 3% FlowLayout - 对按钮面板有用,但其他方面不多。 3% CardLayout - 主要用于针对不同操作模式显示不同内容面板的程序。 2% 其他布局 - 我很少需要其他布局,但有时其他布局之一会派上用场。

一旦你掌握了 GridBagLayout 的窍门,开始编写它并没有那么糟糕,但它仍然不适合使用,或者稍后进行调试。我最近尝试了 MiGLayout,但很失望地发现 MiGLayout 实际上最终在该特定情况下比 GridBagLayout 使用起来复杂。

有些人试图避免像瘟疫一样的GridBagLayout;但事实是,有些事情是简单布局的组合无法处理的。将 GUI 拆分为不同逻辑部分的面板很好,但我认为如果您创建一大堆不必要的额外嵌套面板只是为了定位组件,您显然需要学习如何使用 GridBagLayout(或其他类似的高级布局,如 MiGLayout)。你可能会让你的 GUI 在嵌套的 BorderLayouts 和 GridLayouts 和 BoxLayouts 的混乱中看起来不错,但是一旦有人开始将你的应用程序窗口和对话框的大小调整为比你最初设计的更小或更大,你的 GUI 可能看起来很糟糕你的客户会开始对你的产品产生负面的看法,因为你不能把这么简单的事情做对。

更新:我在 Eclipse 中使用 WindowBuilder 已经有一段时间了,它极大地简化了许多布局的工作,尤其是 GridBagLayout。我曾经花费大量时间手动编写布局,但使用 WindowBuilder 或任何类似的高级可视化编辑器,您可以在更短的时间内创建布局。

【讨论】:

+1,感谢您详细周到的回答!我同意 GBL,但最近开始喜欢 GroupLayout,它做了一些 GBL 做不到的事情。推荐的!和你一样,我发现 MiGLayout几乎很棒。 Box/BoxLayout 是什么意思? @turbanoff 您可以将 Container 的布局设置为 BoxLayout,使其行为类似于 FlowLayout 的默认行为。或者,您可以直接创建一个垂直或水平 Box 作为您的容器(例如,而不是将 JPanel 的布局设置为 BoxLayout)。【参考方案4】:

DesignGridLayout 看起来很棒,并且通过流畅的界面易于使用。

看例子:

只需几行干净的代码:

    layout.row().grid(label("Last Name"))   .add(lastNameField) .grid(label("First Name"))  .add(firstNameField);
    layout.row().grid(label("Phone"))       .add(phoneField)    .grid(label("Email"))       .add(emailField);
    layout.row().grid(label("Address 1"))   .add(address1Field);
    layout.row().grid(label("Address 2"))   .add(address2Field);
    layout.row().grid(label("City"), 1)     .add(cityField);
    layout.row().grid(label("State"))       .add(stateField)    .grid(label("Postal Code")) .add(postalField);
    layout.row().grid(label("Country"), 1)  .add(countryField);
    layout.emptyRow();
    layout.row().center().add(newButton).add(deleteButton).add(editButton).add(saveButton).add(cancelButton);

【讨论】:

感谢这个有趣的布局管理器的指针!我已经为它添加了书签。 很酷,但是有bug,每次调整窗口大小后我的面板都会变大 嗨。你知道我是否可以使用 DesignGridLayout 并将其设置为不占用整个面板?或者在姓氏文本字段和名字标签之间添加一个“空格”?【参考方案5】:

这取决于您需要哪种布局,这就是您拥有 8 个布局的原因:

    BorderLayout,设计普通内容框架(主要内容在中间,助手在侧面)简单且非常有用。 GridLayout,当您有一个大小应该相同的对象网格(按钮?文本字段?)时很有用。 GridBagLayout,非常灵活,需要一些调整才能很好,而且非常冗长(但如果你想把事情做好,我推荐它)。 FlowLayout,没用.. 不是一个非常好的布局:只是将一个项目放在另一个旁边。 CardLayout,对于必须切换的选项卡或子视图很有用。 BoxLayout,没怎么用过。。应该是增强版的FlowLayout,但是不够灵活,不能集中使用。

【讨论】:

BorderLayout 的关键是默认情况下中心是“贪婪的”,并自动扩展其中的小部件以消耗所有可用空间。所有其他插槽都是非“贪婪”的。【参考方案6】:

GroupLayout 相当不错。它最初是供 GUI Builder 应用程序使用的,但我发现它也非常适合手动编写代码。

【讨论】:

我发现“相当体面”是一种轻描淡写的说法!它非常通用,可以做一些 GridBagLayout 做不到的技巧。推荐! 我赞同这种观点。我发现GroupLayout 用途广泛。它产生了一些很好的布局,可以很好地扩展。在用户可以抓住角落并调整大小的窗口中,这会产生漂亮的结果。我也完全手动编写代码。【参考方案7】:

FormLayout,JGoodies Forms 包的一部分一直是我的主力。它不是完全灵活的,因为它努力使您的设计看起来不错。我已经在数十个项目中使用了几年,并且它一直在快速产生好看的输出。

您以人类可读的文本指定布局,然后添加组件。完成。

【讨论】:

+1,谢谢。我一定会去看看! 很少讨论:***.com/questions/tagged/form-layout 无法识别的错误:java.net/jira/browse/FORMS-18【参考方案8】:

我通常使用border layout 和gridlayout,首先我在纸质原型上设计ui ;

(来源:usernomics.com)

之后我们可以在borderlayout上分屏到gridlayout。在这张图片中,我们看到了 NORTH、CENTER、SOUTH 部分(BorderLayout 元素),每个部分的布局都可以是 gridlayout 或 BorderLayout,这取决于你。相同的布局可以在另一个中使用一个。

【讨论】:

Gah 边界。重要提示如何使您的 UI 嘈杂【参考方案9】:

GridBagLayout。几乎可以满足您的所有需求(有点),它位于 Java 库中。诚然,它确实需要一些帮助,而且 API 很糟糕。

GroupLayout 把你的布局代码弄得一团糟。好的,所以大多数人的 GUI 代码是一团泥。但你的不一定是!也许可以在这个布局管理器上放置一个不错的界面,但我怀疑它可能必须被克隆和拥有。

除非真的有必要,否则我不赞成引入外部依赖项。此外,许多第三方布局管理器使用数据字符串,这具有所有常见问题。

【讨论】:

是的...我似乎是团队中唯一了解 GridBagLayout 的人。尽管如此,它仍然很痛苦。我很高兴每个组件平均只能写 4 行代码,但这仅适用于无聊的布局。一定有更好的办法! 呵呵,掌握GridBagLayout 让你立即得到尊重,几乎无处不在。 ;) Bombe:回到 JDK1.02 时代,这实际上是您做的第一件事。今天的孩子们! GridBagLayout 可能需要大量代码,但那是因为它允许您进行很多其他布局所没有的自定义。人们说 GridBagLayout 令人困惑,但我说嵌套面板中使用的所有其他布局的奇怪的大小和定位行为比仅仅学习 GridBagLayout 更令人困惑。 我编写了一个方便的包装类,它使用 GridBagLayout 和一个 builder-pattern-class 来创建 GridBagConstraints - 使大多数组件成为一个衬垫,但让我能够自定义!【参考方案10】:

将 IntelliJ IDEA 与它的 GUI 设计器一起使用。让 GridBagLayout 变得简单。

http://madbean.com/anim/totallygridbag/

【讨论】:

虽然 GridBagLayout 的界面很糟糕,但他闪现的东西只是证明了糟糕的代码就是糟糕的代码。 +1 感谢您的链接。我很欣赏这个意图,但我什至觉得它还不够有趣,不足以引起假笑。也许GBL和幽默不兼容。【参考方案11】:

除此之外,您的问题没有真正的答案:视情况而定。这取决于您要创建什么样的框架(形式)。我不是 Swing 大师,但创建了几个(中等高级)GUI,并且从未需要触摸 GridBagLayout 管理器。我一直能够使用“更简单”的布局管理器的组合来创建我的 GUI。例如,您可以为框架指定 BorderLayout,然后在该 BorderLayout 的 SOUTH 放置另一个布局。

【讨论】:

我在第一次开始 Java 编程时尝试只使用简单的布局,但很快发现这会导致在调整应用程序窗口大小时出现不良行为。【参考方案12】:

我只使用GridBagLayout,尤其是在做一些复杂的接口时,相信我GridBagLayout可以做任何事情。我还推荐了FlowLayout,因为它易于使用,易于理解,适合放置一组按钮。实际上我只使用这两种布局,因为它是 JDK 库的一部分,至于 MigLayout 我还没有尝试过,所以现在不能推荐给你。

【讨论】:

【参考方案13】:

有以下可用的布局选项:

MiGLayout
TableLayout
GroupLayout
FormsLayout

在以上这些中,最推荐的是MigLayout,因为它是swing layout manager。其他人的曝光率并不高。

【讨论】:

【参考方案14】:

我是 Swing 新手,但在编写我的第一个 Swing 应用程序的过程中,我尝试了四种不同的布局管理器:FlowLayout、BoxLayout、GridLayout 和 GroupLayout。在我看来,FlowLayout 和 BoxLayout 似乎最适合布置类似大小的组件组​​。对于不同大小的组件,GroupLayout 似乎是要走的路。比其他两个更陡峭的学习曲线,但绝对值得。至于 GridLayout,我认为您可以通过使用 FlowLayout 和 BoxLayout 的组合来获得与使用该布局管理器相同的结果——并且您可能对组件的放置有更多的控制权。但也许这只是我:)

谢尔顿

【讨论】:

以上是关于您推荐哪种 Swing 布局? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

您会为 linux 推荐哪种甘特图/项目管理工具? [关闭]

推荐一款带有Swing界面设计功能的IDE

对于 PRISM 应用程序推荐哪种程度的模块化?

高流量网站的推荐结构[关闭]

您推荐哪些工具来自动构建您的应用程序? [关闭]

您推荐啥 Java XML 库(替换 dom4j)? [关闭]