大家都用什么java GUI布局管理器?最近,我一直在使用MigLayout,它有一些强大的组件控件。只是想看看除了标准的 JDK 之外,其他开发人员正在使用什么。
22 回答
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 太棒了。
这是使用它的屏幕截图和示例代码!
替代文字 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 个包含大约 10 个类的 jar 文件)简化了很多工作:http ://code.google.com/p/painless-gridbag/以下片段引自该网站的主页:
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
用于更小、更简单的子面板。GridBagLayout
通过将 GUI 的小部分划分为子面板并使用可能的最简单布局来控制 GUI 的该部分,您可以创建复杂、排列良好的显示,而不会因众多选项而感到头疼。此外,通过将类似的显示功能分组到一个面板中,它可以创建更具可读性的代码。
为作为 netbeans 一部分的尾数 gui 构建器开发的Spring 布局。
我也使用过GroupLayout。同样,它是从 Java6 开始的标准 JDK 布局管理器,但您也可以找到单独的库。
我一直是 GridBagLayout 的忠实粉丝。它非常类似于 HTML 表格,因此对于那些 web 程序员来说是直观的。
我开始使用各种嵌套布局,然后转到 GridBagLayout(这很令人沮丧)。从那以后,我尝试了 FormLayout(但发现它不适合除了表单之外的任何东西)并坚定地选择了 TableLayout,总的来说我很满意。
从那时起,我发现了 MiGLayout,虽然除了玩它之外我没有做更多的事情,但它似乎非常有能力,与 TableLayout 非常相似,并且可能更干净一些。
对我来说最大的好处是 MiGLayout 将成为 JDK 的一部分,所以我打算在它出现时完全使用它。
要记住的另一件事是,无论您选择哪种重量级 LayoutManager,总有一些更简单的布局管理器(例如 GridLayout)有一席之地。我已经看到使用 GridBagLayout 完成了一些可怕的事情,而使用更简单的布局管理器可以更轻松地完成这些事情。
我更喜欢尽量减少对 3rd 方库的依赖,因此通常是 BoxLayout 用于对话框,而 GridBagLayout 用于“复杂”布局。GridBagLayout 很容易理解,但配置起来有点困难。我为自己编写了一个从 HTML 布局创建代码的工具(希望对其他人也有帮助): http ://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy
我发现的唯一一个我真正喜欢的布局管理器是相对布局管理器。相对布局管理器的工作方式与对话框的概念组织方式一致。一个缺点是,虽然此布局管理器处理附加约束。它似乎没有处理比率约束。幸运的是,它设计得很好,我能够实现这个功能。
我在嵌套BoxLayout和SpringLayout时使用BorderLayout 90%
我有点Java新手。
我尝试了 GridBagLayout,放弃了,然后尝试了 BoxLayout,然后放弃了,然后制作了我自己的自定义布局,它有效。对于 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 ;) 你自己负责正确的布局,因为它不会检查布局的重叠或其他缺点。