您推荐哪种Swing布局?

时间:2009-12-02 11:49:03

标签: java swing layout layout-manager

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

前几天,我尝试使用SpringLayout ......好吧,它对我不起作用。查看我的other question。所以...如果您有一个Swing应用程序进行设计,并且您希望布局就这样,那么您首选的布局管理器是什么?有关的任何有趣/有用的经历?

更新:是的,确定我知道不同的LM适合不同的布局。但是我希望大多数人在你做的大部分事情中都使用1,2或3,或者你发誓这是一个多才多艺的你永远不需要的东西。有足够的响应,我希望看到类似钟形曲线的东西,在GridBagLayout或MigLayout(例如)上有一个峰值,以及使用(例如)BoxLayout或FlowLayout的几个散乱者的长尾。

希望,回复的分布将揭示人们最常使用的一些趋势 Get Stuff Done


更新和摘要

好的,差不多2天后,MiGLayout肯定在前面!它的粉丝很高兴听到这种布局很快就会进入“官方”图书馆。

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

14 个答案:

答案 0 :(得分:62)

毫无疑问,{p> MiGLayout。老实说,这是我所知道的唯一合理的Swing布局管理器。

核心JDK中有8个布局管理器这一事实表明,Swing创建者完全不知道他们想要做什么。这不是要废弃Swing的其余部分 - 除了布局管理器之外,它是一个很好的GUI工具包。

答案 1 :(得分:23)

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

“在单个面板中执行所有操作”布局管理器(如GridBagLayoutGroupLayout(以及许多第三方的布局管理器)都有自己的位置,主要是当您需要布局的不同部分中的组件时对齐,但布局较大,通常会造成巨大的,难以处理的混乱。

答案 2 :(得分:16)

这取决于您创建的GUI类型。您可能只使用一个或两个简单布局,或者您可能需要达到更高级的布局。我的总体布局管理器使用可能会分解为类似的东西,尽管它会因项目而异:

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

一旦你掌握了GridBagLayout,最初编写它并不是那么糟糕,但是它仍然不适合使用,或者稍后调试。我最近尝试了MiGLayout,并且很惊讶地发现MiGLayout在特定情况下实际上最终使用的更多比GridBagLayout更复杂。

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

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

答案 3 :(得分:15)

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

只看例子:

enter image description here

只需几行干净的代码:

    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);

答案 4 :(得分:11)

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

  1. BorderLayout,简单而且非常有用,可以设计正常的内容框架(主要内容位于中间,辅助工具位于侧面)。
  2. GridLayout,当你有一个大小相同的对象网格(按钮?textfields?)时很有用。
  3. GridBagLayout,非常灵活,需要一些调整才能很好,而且非常冗长(但如果你想做好事情,我会感激不尽。)
  4. FlowLayout,没用..不是很布局:只需将第一项放在另一个旁边。
  5. CardLayout,对必须切换的标签页或子视图非常有用。
  6. BoxLayout,从未使用太多..它应该是一种增强的FlowLayout,但它不够灵活,无法集中使用。

答案 5 :(得分:9)

GroupLayout非常体面。它原本打算供GUI Builder应用程序使用,但我发现手动编码也非常直接。

答案 6 :(得分:8)

FormLayoutJGoodies Forms包的一部分对我来说是一个主力。它并不是非常灵活,因为它很难让你的设计看起来很好。我已经在几十个项目中使用了它好几年,并且它可以快速生成美观的输出。

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

答案 7 :(得分:6)

GridBagLayout。几乎所有你需要的东西(种类)和它在Java库中。不可否认,它确实需要一些帮助,API非常糟糕。

GroupLayout使您的布局代码变得混乱。好的,所以大多数人的GUI代码都是一个很大的漏洞。但你不一定要这样!也许一个漂亮的界面可以放在这个布局管理器上,但我怀疑它可能必须被克隆并拥有。

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

答案 8 :(得分:6)

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

alt text
(来源:usernomics.com

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

答案 9 :(得分:5)

你的问题没有真正的答案,除了:它取决于你。这取决于您尝试创建的框架(窗体)类型。我不是Swing-guru,但创建了一些(中等高级)GUI,并且从未需要触摸GridBagLayout管理器。我总是能够使用“更简单”的布局管理器来创建我的GUI。例如,您可以为您的框架提供BorderLayout,然后在该BorderLayout的SOUTH中放置另一个布局。

答案 10 :(得分:5)

将IntelliJ IDEA与其GUI设计器配合使用。使GridBagLayout变得容易。

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

答案 11 :(得分:4)

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

答案 12 :(得分:3)

有以下可用的布局选项:

MiGLayout
TableLayout
GroupLayout
FormsLayout

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

答案 13 :(得分:2)

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

谢尔顿