43

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

前几天,我尝试使用 SpringLayout 并且......好吧,它不适合我。请参阅我的另一个问题。所以...如果你有一个 Swing 应用程序要设计,并且你想要你的布局,那么你首选的布局管理器是什么?有什么有趣/有用的经验可以联系吗?

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

希望响应的分布能够揭示一些趋势,即人们最常使用什么来完成工作™


更新和总结

好的,差不多 2 天后,MiGLayout 绝对领先!它的粉丝会很高兴听到这个布局看起来很快就会进入“官方”图书馆。

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

4

14 回答 14

65

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

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

于 2009-12-02T11:55:09.950 回答
23

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

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

于 2009-12-03T07:23:14.317 回答
18

这取决于您正在创建什么样的 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 或任何类似的高级可视化编辑器,您可以在更短的时间内创建布局。

于 2009-12-03T08:12:10.053 回答
15

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);
于 2013-03-15T07:30:01.957 回答
12

这取决于您需要哪种布局,这就是为什么您有 8 个布局:

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

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

于 2009-12-02T12:02:24.257 回答
8

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

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

于 2009-12-02T14:19:44.970 回答
7

我通常使用带有gridlayout的边框布局,首先我在纸质原型上设计ui;

替代文字
(来源:usernomics.com

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

于 2009-12-03T07:01:47.073 回答
6

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

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

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

于 2009-12-02T13:09:30.137 回答
5

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

于 2009-12-02T11:54:41.847 回答
5

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

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

于 2009-12-02T12:02:12.707 回答
4

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

于 2012-08-28T13:32:10.017 回答
3

有以下布局选项可用:

MiGLayout
TableLayout
GroupLayout
FormsLayout

在上面的这些中,最推荐的是 MigLayout,因为它是 Swing 布局管理器。其他人没有得到太多曝光。

于 2011-09-05T11:18:03.353 回答
2

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

谢尔顿

于 2012-02-03T22:47:55.720 回答