【发布时间】:2010-09-12 03:08:09
【问题描述】:
大家都用什么java GUI布局管理器?最近一直在用MigLayout,它有一些强大的组件控件。只是想看看其他开发人员在使用标准 JDK 之外的什么。
【问题讨论】:
大家都用什么java GUI布局管理器?最近一直在用MigLayout,它有一些强大的组件控件。只是想看看其他开发人员在使用标准 JDK 之外的什么。
【问题讨论】:
MiGLayout 是 Java 开发人员广泛使用的 GUI 布局管理器。
【讨论】:
GridBagLayout 可用。一旦你习惯了使用它,它就会很好用。我认为标准的 JDK 布局管理器本身就非常强大。此外,您还可以最大限度地减少对 3rd 方库的依赖。
【讨论】:
MiG 和 FormLayout (JGoodies) 都非常适合手动布局(几乎所有布局最终都变成了手动)。我最大的建议是设计你的视图,这样你就可以完全去掉布局并重新实现它而不影响你的应用程序(视图和控制器的良好分离是关键)。
一定要看看 JGoodie 的 PresentationModel 方法来实现“哑”视图。我将这种技术与 GUI 构建器一起使用(我将 GroupLayout 与 Jigloo GUI 构建器插件一起使用)来折腾快速原型。经过 3 或 4 次迭代后,这通常会消失,我们使用 MiG 或 FormLayout 重新实现。
编辑:自从我写了这篇文章后,我已经开始使用 MiG 进行所有布局,并且我不再使用 GUI 构建器 - 使用 MiG 进行布局太容易了。
【讨论】:
我使用的最后一个 Swing 应用程序使用 JGoodies' FormsLayout。
【讨论】:
我使用GridBagLayout。它似乎需要很多代码,但它使布局看起来非常漂亮。
我还喜欢将BorderLayout 与 GridBagLayout 面板结合使用,以获得出色的可定制性。
【讨论】:
我非常喜欢使用 TableLayout 而不是 GridBagLayout。一切都是有道理的,而每次我尝试使用 GridBagLayout 时,它都会让我心碎。
【讨论】:
我以前用 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 ) );
}
【讨论】:
我的大部分面板都使用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 有一些独特的功能(例如它的“智能垂直调整大小”)。
【讨论】:
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();
【讨论】:
作为一般概述,您可能会发现我很久以前在 sun 上写的一篇文章很有用。它不是最新的布局管理器,但它专注于布局管理器的有效嵌套,而不是试图用一个布局来做所有事情。
见http://developer.java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr
【讨论】:
我发现对于任何重要的 GUI,我都使用带有嵌套子面板的多个布局,其中主面板可能有一个 GridBagLayout 和每个子面板(通常没有边框或指示它是一个面板) 尽可能使用更简单的布局。通常我会使用BorderLayout、FlowLayout 和BoxLayout 来制作更小、更简单的子面板。通过将 GUI 的小部分划分为子面板并使用可能的最简单布局来控制 GUI 的该部分,您可以创建复杂、排列良好的显示,而不会因GridBagLayout 的众多选项而感到头疼。此外,通过将类似的显示功能分组到一个面板中,它可以创建更具可读性的代码。
【讨论】:
Spring layout 是为作为 netbeans 一部分的尾数 gui 构建器开发的。
【讨论】:
我也使用过GroupLayout。同样,它是从 Java6 开始的标准 JDK 布局管理器,但您也可以找到单独的库。
【讨论】:
我一直是 GridBagLayout 的忠实粉丝。它非常类似于 HTML 表格,因此对于那些 Web 程序员来说很直观。
【讨论】:
我开始使用各种嵌套布局,然后转到 GridBagLayout(这很令人沮丧)。从那以后我尝试了 FormLayout(但发现它不适合除了表单之外的任何东西)并坚定地选择了 TableLayout,总的来说我很满意。
从那时起,我发现了 MiGLayout,虽然我除了玩它并没有做更多的事情,但它似乎非常有能力,与 TableLayout 非常相似,并且可能更干净一些。
对我来说最大的好处是 MiGLayout 将成为 JDK 的一部分,所以我打算在它出现时几乎完全使用它。
要记住的另一件事是,无论您选择哪个重量级的 LayoutManager,总会有一些更简单的布局管理器,例如 GridLayout。我已经看到使用 GridBagLayout 完成了一些可怕的事情,而使用更简单的布局管理器可以更轻松地完成这些事情。
【讨论】:
我更喜欢尽量减少对第 3 方库的依赖,因此通常是 BoxLayout 用于对话框,而 GridBagLayout 用于“复杂”布局。 GridBagLayout 很容易理解,但配置起来有点困难。我为自己编写了一个从 HTML 布局创建代码的工具(希望对其他人也有帮助): http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy
【讨论】:
我发现的唯一一个实际上喜欢的布局管理器是Relative Layout Manager。相对布局管理器的工作方式与对话框的概念组织方式一致。一个缺点是,虽然此布局管理器处理附加约束。它确实不似乎处理比率约束。幸运的是它设计得很好,我能够实现这个功能。
【讨论】:
在嵌套BoxLayout 和SpringLayout 时,我有90% 的时间使用BorderLayout
【讨论】:
我是 Java 新手。
我尝试了 GridBagLayout,放弃了,然后尝试了 BoxLayout,然后放弃了,然后创建了自己的 Custom Layout,它有效。对于 GridBag 和 Box,我做出了最好的猜测,布局引擎决定做一些不同的事情,没有任何明显的方式来调试它们。
使用我的自定义布局,我可以打印出坐标、宽度和高度,以找出哪里出了问题。放置东西有点数学,但您可以使用 java 的全部功能,而不是使用其中一个内置布局管理器的有限词汇。
当然,这只是一个家庭项目,你永远不能在工作中这样做。
【讨论】:
我将 GridBagLayout 用于类似布局的表单,将 BorderLayout 用于简单布局,将 FlowLayout 用于中间有一些空格的水平图标/按钮的数量。 Netbeans 也是一个很好的 GUI 构建器,可以避免大量繁琐的布局编码以节省您的时间。
【讨论】:
我最近开始使用 Swing,并且正在使用 GridBagLayout。
【讨论】:
我厌倦了所有那些需要大量设置、可读性不强或手动完成的布局管理器,所以我编写了自己的非常简单的 laoutmanager,它使用两个照片角的抽象来保持每个组件的位置。你可以像这样添加你的组件:parent.add(child,"topleft(0, 0.5)bottomright(0.5,1.0)");
看看这里https://github.com/hageldave/UsefulStuff/blob/master/src/PhotoCornersLayout.java ;) 不过,您自己负责正确的布局,因为它不会检查布局的重叠或其他缺陷。
【讨论】: