你推荐哪个Swing布局?

Java库中只有8个布局pipe理器,还有一些第三方产品。

有一天,我试图使用SpringLayout和…呃,它不是为我工作。 看到我的其他问题 。 所以…如果你有一个Swing应用程序来devise,而你想要你的布局,那么你最喜欢的布局pipe理器是什么? 任何有趣的/有用的经验,以涉及?

更新:是的 ,我知道不同的LM适合不同的布局。 但是我希望你们中的大多数人对于你所做的一切事物都使用1,2或者3个,或者你发誓一个多才多艺的人,你永远不需要别的什么。 有了足够的回应,我期望看到类似于钟形曲线的东西,在GridBagLayout或MigLayout(例如)上有一个峰值,还有一些使用(比如说)BoxLayout或FlowLayout的散列函数的尾部。

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


更新和总结

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

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

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

事实上,在核心JDK中有8个布局pipe理者是Swing创build者完全不知道他们正在尝试做什么的一个好兆头。 这不是为了垃圾Swing的其余部分 – 这是一个很好的GUI工具包,除了布局pipe理器。

所有这些,组合在一起。 这就是整个问题。 每个布局pipe理器都满足不同的要求,通过将面板与不同的布局pipe理器嵌套,几乎可以实现任何function。

GridBagLayoutGroupLayout (以及大量的第三方)的“一切都在一个面板中”的布局pipe理器有其自己的位置,主要是当你需要在布局的不同部分的组件alignment,但是一个大的布局,在一个巨大的,难以处理的混乱。

这取决于你正在创build什么样的GUI。 您可能只使用一个或两个简单的布局,或者您可能需要达到更高级的布局。 我的整体布局pipe理器使用可能会分解成这样的东西,虽然它会根据项目而有所不同:

  • 65%GridBagLayout – 无论您需要做什么,都可以完成一个布局。
  • 15%箱子/箱子布局 – 伟大为快速&容易地黏附一起夫妇组分。
  • 12%BorderLayout – 适用于将button面板或信息面板附加到内容面板。 我几乎总是用它来添加内容到一个JFrame。
  • 3%FlowLayout – 用于button面板,但没有其他的东西。
  • 3%CardLayout – 对于为不同操作模式显示不同内容面板的程序非常有用。
  • 2%其他布局 – 我很less需要其他任何东西,但有时其他布局中的其中一个派上用场。

一旦你得到了GridBagLayout的悬挂,开始写起来并不是什么坏事,但是用起来还是不太好,或者稍后再进行debugging。 我最近尝试了MiGLayout,并且感到失望的是,发现MiGLayout实际上比GridBagLayout在这种情况下更加复杂。

有些人试图避免像鼠疫一样的GridBagLayout; 但事实是,有一些事情,没有简单的布局组合将能够处理。 把GUI分割成不同逻辑部分的面板很好,但是我想如果你为了定位组件而创build了一大堆不必要的额外嵌套面板,那么显然你需要学习如何使用GridBagLayout(或者其他的类似先进的布局,如MiGLayout)。 你可能会得到一个令人讨厌的嵌套BorderLayouts和GridLayouts和BoxLayouts混乱的GUI,但只要有人开始调整你的应用程序窗口和对话框的大小,或者比你最初devise的小或大,你的GUI可能看起来很糟糕而你的客户会开始对你的产品形成负面评价,因为你无法得到这么简单的东西。

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

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

看看例子:

在这里输入图像说明

只需要几行简洁的代码:

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

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

  1. BorderLayout ,devise普通的内容框架(主要内容在中间,帮助者侧),简单而且非常有用。
  2. GridLayout ,当你有一个应该是相同大小的对象(button?文本框?)的网格时很有用。
  3. GridBagLayout非常灵活,需要进行一些调整,并且非常冗长(但是如果你想做的很好的话,我会采取相应的措施)。
  4. FlowLayout ,没用的..不是一个非常布局:只是把项目一个接一个。
  5. CardLayout ,对于必须切换的选项卡或子视图很有用。
  6. BoxLayout ,从来没有使用太多..它应该是一种增强的FlowLayout但它不够灵活,使用密集。

GroupLayout是相当不错的。 它最初是为GUI Builder应用程序使用,但我发现它也是非常简单的手动代码。

作为JGoodies Forms包的一部分, FormLayout对我来说是一个重要的工具。 它不是非常灵活,它很难使你的devise看起来不错。 我在几十个项目上使用了好几年,并且一直在快速生成好看的输出。

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

GridBagLayout 。 几乎所有你需要(种),它在Java库中。 无可否认,这确实需要一些帮助,API太糟糕了。

GroupLayout使您的布局代码真正混乱。 好吧,所以大部分人的GUI代码都是泥土的大球。 但是你的不必是! 也许一个漂亮的界面可以放在这个布局pipe理器上,但是我怀疑它可能要被克隆和拥有。

除非真的有必要,否则我不赞成引入外部依赖。 还有很多第三方布局pipe理者使用数据串,这些数据都有一些常见的问题。

我通常使用网格 布局的边界布局 ,首先我devise用户界面纸上的原型,

替代文字http://www.usernomics.comhttp://img.dovov.compaper-mockup.jpg

之后,我们可以将屏幕拆分为borderlayout上的网格布局。 在这幅图中,我们看到NORTH,CENTER,SOUTH部分(BorderLayout元素)和每个部分的布局可以是gridlayout或BorderLayout,这取决于你。 相同的布局可以使用其中一个。

除了这个问题,你的问题没有真正的答案:这取决于。 这取决于你想创build什么样的框架(forms)。 我不是Swing-guru,而是创build了几个(中等先进的)GUI,并且从来没有需要触摸GridBagLayoutpipe理器。 我一直能够使用“更容易”的布局pipe理器的组合来创build我的GUI。 例如,您可以为您的框架指定BorderLayout,然后在该BorderLayout的南部放置另一个布局。

使用IntelliJ IDEA及其GUIdevise器。 使GridBagLayout变得容易。

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

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

有以下布局选项可用:

 MiGLayout TableLayout GroupLayout FormsLayout 

在上面的MigLayout中,最值得推荐的是摆动布局pipe理器。 其他人没有太多的曝光。

我是Swing初学者,但是在编写我的第一个Swing应用程序的过程中,我尝试了四种不同的布局pipe理器:FlowLayout,BoxLayout,GridLayout和GroupLayout。 在我看来,FlowLayout和BoxLayout似乎最适合用于布置类似大小的组件。 对于不同规模的组件,GroupLayout似乎是要走的路。 陡峭的学习曲线比其他两个,但绝对值得。 至于GridLayout,我认为你可以通过使用FlowLayout和BoxLayout的组合来达到与布局pipe理器相同的结果 – 而且你可能对组件的位置有更多的控制。 但也许这只是我:)

谢尔顿