您推荐哪种Swing布局?

Car*_*icz 43 java layout swing layout-manager

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

前几天,我试图使用SpringLayout ......好吧,它对我不起作用.看到我的另一个问题.所以...如果你有一个Swing应用程序的设计,并希望您的布局只是这样,什么是您的首选布局管理器?有关的任何有趣/有用的经历?

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

希望,回复的分布将揭示人们最常使用什么来获取Stuff Done ™的一些趋势


更新和摘要

好的,差不多2天后,MiGLayout绝对不在眼前!它的粉丝很高兴听到这个布局很快就会进入"官方"图书馆.

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

Joo*_*kka 62

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

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

  • -1不同意100%.不同的布局管理器用于不同的目的,可以组合起来做几乎任何事情.这没什么不对, (16认同)
  • 有八个接口实现并不是弱点的表现!(虽然不能保证没有无关的弱点.) (7认同)
  • 像不同的机器指令用于不同的目的,可以组合起来做几乎任何事情.这没有什么不对,但我宁愿使用更高级别的语言来更轻松地实现同样的效果. (7认同)
  • 我在这里和Joonas在一起.这些布局看起来像是建立在经验丰富的经验上.这没什么不对,但这意味着一些旧版本没有那么有用. (3认同)
  • 经过大约三十分钟的挣扎,每一个'默认'布局,我用Google搜索并找到了这个问题.对于一个史诗般的推荐+1,我在大约3秒钟内选择了MiGLayout(相比30分钟仍然没有任何默认布局......) (3认同)
  • 当然 - 它也可能是一个有意的设计决定.但是,鉴于每个JDK发布时,该数量已经*逐渐增加到8,它看起来就像是尝试修复早期的错误实现. (2认同)

Mic*_*rdt 22

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

"在单个面板中做所有事情"布局管理器GridBagLayoutGroupLayout(以及许多第三方)布局管理器都有它们的位置,主要是当您需要布局的不同部分中的组件对齐时,但是布局较大时,它们通常会导致巨大的,难以处理的混乱.


rob*_*rob 17

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


man*_*rid 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);
Run Code Online (Sandbox Code Playgroud)


Jac*_*ack 11

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

  1. BorderLayout,简单而且非常有用的设计普通内容框架(主要内容在中间,助手在侧面).
  2. GridLayout,当你有一个对象网格应该是相同的大小(按钮?textfields?)时很有用.
  3. GridBagLayout,非常灵活,需要一些调整要被罚款,这是非常详细的(但我raccomend,如果你想要做的事情做好).
  4. FlowLayout,没用..不是很布局:只需将第一项放在另一项旁边.
  5. CardLayout,对必须切换的标签或子视图很有用.
  6. BoxLayout从来没有过多地使用它......它应该是一种增强的,FlowLayout但它不够灵活,不能集中使用.


nin*_*ded 9

GroupLayout很不错.它原本打算供GUI Builder应用程序使用,但我发现手动编码非常简单.

  • 我发现“相当不错”是轻描淡写的!它的用途非常广泛,可以完成一些 GridBagLayout 无法完成的任务。受到推崇的! (2认同)
  • 我赞同这种观点。我发现“GroupLayout”用途极其广泛。它产生了一些很棒的布局,并且可以很好地扩展。在用户可以抓住角落并调整大小的窗口中,这会产生漂亮的结果。我也完全手工编码。 (2认同)

cla*_*taq 8

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

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


Tom*_*ine 6

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

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

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

  • GridBagLayout可能会占用大量代码,但这是因为它允许您进行如此多的自定义,许多其他布局都没有.人们说的GridBagLayout是混乱的,但我说,在嵌套的面板中使用的所有其他布局的奇大小和位置的行为不仅仅是学习的GridBagLayout更加混乱. (2认同)

bay*_*ren 6

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

alt text http://www.usernomics.com/images/paper-mockup.jpg

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


Bar*_*ers 5

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


gle*_*ebm 5

使用IntelliJ IDEA及其GUI设计器.使GridBagLayout变得容易.

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