您使用哪个布局管理器?
Posted
技术标签:
【中文标题】您使用哪个布局管理器?【英文标题】:Which Layout Manager do you use? 【发布时间】:2010-09-12 03:08:09 【问题描述】:大家都用什么java GUI布局管理器?最近一直在用MigLayout,它有一些强大的组件控件。只是想看看其他开发人员在使用标准 JDK 之外的什么。
【问题讨论】:
【参考方案1】:MiGLayout 是 Java 开发人员广泛使用的 GUI 布局管理器。
【讨论】:
我刚试过,太棒了!只要看看网站,你就会知道。当你看到它在行动时,不需要用语言来证明它! 让我们添加一些优点和缺点。 MigLayout 最突出的特点可能是它的调试模式,在 UI 上用虚线显示单元格和组件的边界。这对于理解为什么布局会变坏至关重要。缺点...好吧,它不是 JDK 的一部分,但它只是一个 75k 依赖项。 MigLayout 易于学习,并且可以按照您的期望进行操作。只需打印它的“备忘单”。它有很好的示例应用程序。可以编写可读和可变的布局。它具有有用的调试模式。我写了 2 年的 Swing 应用程序。相信我不要使用标准布局,这是地狱般的绘画方式,请使用 MigLayout。【参考方案2】:GridBagLayout 可用。一旦你习惯了使用它,它就会很好用。我认为标准的 JDK 布局管理器本身就非常强大。此外,您还可以最大限度地减少对 3rd 方库的依赖。
【讨论】:
【参考方案3】:MiG 和 FormLayout (JGoodies) 都非常适合手动布局(几乎所有布局最终都变成了手动)。我最大的建议是设计你的视图,这样你就可以完全去掉布局并重新实现它而不影响你的应用程序(视图和控制器的良好分离是关键)。
一定要看看 JGoodie 的 PresentationModel 方法来实现“哑”视图。我将这种技术与 GUI 构建器一起使用(我将 GroupLayout 与 Jigloo GUI 构建器插件一起使用)来折腾快速原型。经过 3 或 4 次迭代后,这通常会消失,我们使用 MiG 或 FormLayout 重新实现。
编辑:自从我写了这篇文章后,我已经开始使用 MiG 进行所有布局,并且我不再使用 GUI 构建器 - 使用 MiG 进行布局太容易了。
【讨论】:
【参考方案4】:我使用的最后一个 Swing 应用程序使用 JGoodies' FormsLayout。
【讨论】:
【参考方案5】:我使用GridBagLayout。它似乎需要很多代码,但它使布局看起来非常漂亮。
我还喜欢将BorderLayout 与 GridBagLayout 面板结合使用,以获得出色的可定制性。
【讨论】:
【参考方案6】:我非常喜欢使用 TableLayout 而不是 GridBagLayout。一切都是有道理的,而每次我尝试使用 GridBagLayout 时,它都会让我心碎。
【讨论】:
【参考方案7】:我以前用 GridBagLayout 作为控件,但是从 java1.6 开始我要使用 GroupLayout 太棒了。
这里有一个截图和示例代码来使用它!
alt text http://img145.imageshack.us/img145/7844/screenshot1dz8.png
private void layoutComponents()
JPanel panel = new JPanel();
GroupLayout layout = new GroupLayout(panel);
panel.setLayout(layout);
layout.setAutoCreateGaps(true);
layout.setAutoCreateContainerGaps(true);
SequentialGroup hGroup = layout.createSequentialGroup();
JLabel nameLbl = new JLabel("Name");
JLabel countLbl = new JLabel("Amount");
JLabel dateLbl = new JLabel("Date(dd/MM/yy)");
hGroup.addGroup(layout.createParallelGroup().
addComponent(nameLbl).
addComponent(countLbl).
addComponent(dateLbl).
addComponent(go));
hGroup.addGroup(layout.createParallelGroup().
addComponent(name).
addComponent(count).
addComponent(date));
layout.setHorizontalGroup(hGroup);
SequentialGroup vGroup = layout.createSequentialGroup();
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(nameLbl).addComponent(name));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(countLbl).addComponent(count));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(dateLbl).addComponent(date));
vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE).
addComponent(go));
layout.setVerticalGroup(vGroup);
frame.add( panel , BorderLayout.NORTH );
frame.add( new JScrollPane( textArea ) );
【讨论】:
我已经删除了死链接。 .【参考方案8】:我的大部分面板都使用DesignGridLayout。
对于DesignGridLayout
无法完全处理的稀有面板,我混合使用了Borderlayout 和DesignGridLayout
。
使用 DesigngridLayout,您可以用最少的代码行数手动对布局进行编码,这些代码行易于输入和阅读:
DesignGridLayouut layout = new DesignGridLayout(myPanel);
layout.row().grid(lblFirstName).add(txfFirstName).grid(lblSurName).add(txfSurName);
layout.row().grid(lblAddress).add(txfAddress);
layout.row().center().add(btnOK, btnCancel);
面板网格的每一行都由一行代码定义。如您所见,“绘制”面板非常简单。
此外,我发现DesignGridLayout
有一些独特的功能(例如它的“智能垂直调整大小”)。
【讨论】:
糟糕,我忘记了通常的免责声明:“我是 DesignGridLayout 项目所有者之一”;-)【参考方案9】:GridBagLayout 功能强大但非常原始:连接布局的代码非常冗长。这个实用程序库(实际上只有 1 个 jar 文件,包含大约 10 个类)简化了很多工作:http://code.google.com/p/painless-gridbag/ 以下 sn-p 引用自该站点的主页:
PainlessGridBag gbl = new PainlessGridBag(getContentPane(), false);
gbl.row().cell(lblFirstName).cell(txtFirstName).fillX()
.cell(lblFamilyName).cell(txtFamilyName).fillX();
gbl.row().cell(lblAddress).cellXRemainder(txtAddress).fillX();
gbl.doneAndPushEverythingToTop();
【讨论】:
这样的好处是你可以把这10个类复制到你的项目中,不依赖第三方库...【参考方案10】:作为一般概述,您可能会发现我很久以前在 sun 上写的一篇文章很有用。它不是最新的布局管理器,但它专注于布局管理器的有效嵌套,而不是试图用一个布局来做所有事情。
见http://developer.java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr
【讨论】:
【参考方案11】:我发现对于任何重要的 GUI,我都使用带有嵌套子面板的多个布局,其中主面板可能有一个 GridBagLayout
和每个子面板(通常没有边框或指示它是一个面板) 尽可能使用更简单的布局。通常我会使用BorderLayout
、FlowLayout
和BoxLayout
来制作更小、更简单的子面板。通过将 GUI 的小部分划分为子面板并使用可能的最简单布局来控制 GUI 的该部分,您可以创建复杂、排列良好的显示,而不会因GridBagLayout
的众多选项而感到头疼。此外,通过将类似的显示功能分组到一个面板中,它可以创建更具可读性的代码。
【讨论】:
【参考方案12】:Spring layout 是为作为 netbeans 一部分的尾数 gui 构建器开发的。
【讨论】:
我以为马蒂斯使用了 GroupLayout。 BDK 中有一个 SpringLayout GUI 构建器。我不会推荐它。在内部,GroupLayout 实现确实使用了它所谓的弹簧。【参考方案13】:我也使用过GroupLayout。同样,它是从 Java6 开始的标准 JDK 布局管理器,但您也可以找到单独的库。
【讨论】:
【参考方案14】:我一直是 GridBagLayout 的忠实粉丝。它非常类似于 html 表格,因此对于那些 Web 程序员来说很直观。
【讨论】:
【参考方案15】:我开始使用各种嵌套布局,然后转到 GridBagLayout(这很令人沮丧)。从那以后我尝试了 FormLayout(但发现它不适合除了表单之外的任何东西)并坚定地选择了 TableLayout,总的来说我很满意。
从那时起,我发现了 MiGLayout,虽然我除了玩它并没有做更多的事情,但它似乎非常有能力,与 TableLayout 非常相似,并且可能更干净一些。
对我来说最大的好处是 MiGLayout 将成为 JDK 的一部分,所以我打算在它出现时几乎完全使用它。
要记住的另一件事是,无论您选择哪个重量级的 LayoutManager,总会有一些更简单的布局管理器,例如 GridLayout。我已经看到使用 GridBagLayout 完成了一些可怕的事情,而使用更简单的布局管理器可以更轻松地完成这些事情。
【讨论】:
【参考方案16】:我更喜欢尽量减少对第 3 方库的依赖,因此通常是 BoxLayout 用于对话框,而 GridBagLayout 用于“复杂”布局。 GridBagLayout 很容易理解,但配置起来有点困难。我为自己编写了一个从 HTML 布局创建代码的工具(希望对其他人也有帮助): http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy
【讨论】:
【参考方案17】:我发现的唯一一个实际上喜欢的布局管理器是Relative Layout Manager。相对布局管理器的工作方式与对话框的概念组织方式一致。一个缺点是,虽然此布局管理器处理附加约束。它确实不似乎处理比率约束。幸运的是它设计得很好,我能够实现这个功能。
【讨论】:
【参考方案18】:在嵌套BoxLayout 和SpringLayout 时,我有90% 的时间使用BorderLayout
【讨论】:
【参考方案19】:我是 Java 新手。
我尝试了 GridBagLayout,放弃了,然后尝试了 BoxLayout,然后放弃了,然后创建了自己的 Custom Layout,它有效。对于 GridBag 和 Box,我做出了最好的猜测,布局引擎决定做一些不同的事情,没有任何明显的方式来调试它们。
使用我的自定义布局,我可以打印出坐标、宽度和高度,以找出哪里出了问题。放置东西有点数学,但您可以使用 java 的全部功能,而不是使用其中一个内置布局管理器的有限词汇。
当然,这只是一个家庭项目,你永远不能在工作中这样做。
【讨论】:
【参考方案20】:我将 GridBagLayout 用于类似布局的表单,将 BorderLayout 用于简单布局,将 FlowLayout 用于中间有一些空格的水平图标/按钮的数量。 Netbeans 也是一个很好的 GUI 构建器,可以避免大量繁琐的布局编码以节省您的时间。
【讨论】:
【参考方案21】:我最近开始使用 Swing,并且正在使用 GridBagLayout。
【讨论】:
【参考方案22】:我厌倦了所有那些需要大量设置、可读性不强或手动完成的布局管理器,所以我编写了自己的非常简单的 laoutmanager,它使用两个照片角的抽象来保持每个组件的位置。你可以像这样添加你的组件:parent.add(child,"topleft(0, 0.5)bottomright(0.5,1.0)");
看看这里https://github.com/hageldave/UsefulStuff/blob/master/src/PhotoCornersLayout.java ;) 不过,您自己负责正确的布局,因为它不会检查布局的重叠或其他缺陷。
【讨论】:
以上是关于您使用哪个布局管理器?的主要内容,如果未能解决你的问题,请参考以下文章