我们使用哪个布局管理器?

时间:2020-03-06 14:33:33  来源:igfitidea点击:

每个人都使用什么Java GUI布局管理器?最近,我一直在使用MigLayout,它具有一些强大的组件控件。只是想看看其他开发人员在使用除标准JDK之外的工具。

解决方案

Spring布局是为netbeans的尾数gui生成器开发的。

我使用的最后一个Swing应用程序使用了JGoodies的FormsLayout。

GridBagLayout可用。一旦习惯了使用它,它就会很好用。我认为标准的JDK布局管理器本身非常强大。另外,我们可以最大程度地减少对第三方库的依赖。

我使用GridBagLayout。它似乎需要很多代码,但是布局却非常漂亮。

我还喜欢将BorderLayout与GridBagLayout面板结合使用,以实现出色的可定制性。

我也使用了GroupLayout。同样,它是Java6的标准JDK布局管理器,但是我们也可以找到独立的库。

我是使用TableLayout而不是GridBagLayout的忠实粉丝。一切都说得通,而每次我尝试使用GridBagLayout时,我的心都被压碎了。

我真正喜欢的唯一布局管理器是相对布局管理器。相对布局管理器的工作方式与对话框在概念上的组织方式一致。一个缺点是,尽管此布局管理器处理添加约束。它似乎没有处理比率约束。幸运的是,它的设计非常好,我能够实现此功能。

作为一般概述,我们可能会发现我前一段时间在sun上写的一篇文章很有用。它与最新的布局管理器不是最新的,但它专注于布局管理器的有效嵌套,而不是尝试使用一个布局来完成所有操作。

参见http://developer.java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr

MiG和FormLayout(JGoodies)都非常适合手动布局(几乎所有布局最终都变为手动)。我最大的建议是设计视图,以便我们可以完全删除布局并重新实现它,而又不影响应用程序(在这里,视图和控制器之间的良好分隔是关键。)

一定要看看JGoodie的PresentationModel方法来实现"哑巴"视图。我将这种技术与GUI构建器一起使用(我将Jigloo GUI构建器插件与GroupLayout一起使用)来扔掉快速原型。经过3或者4次迭代后,通常会消失在窗口中,我们使用MiG或者FormLayout进行重新实现。

编辑:自从我写这篇文章以来,我已经开始将MiG用于所有布局,而我不再使用GUI构建器,使用MiG布置内容太简单了。

我一直是GridBagLayout的忠实拥护者。它非常类似于HTML表格,因此对于那些Web程序员来说很直观。

我发现,对于任何非平凡的GUI,我使用带有嵌套子面板的多个布局,其中主面板可能具有一个" GridBagLayout",而每个子面板(通常没有边框或者表明它是一个面板)都使用一个尽可能简化布局。通常,对于较小,更简单的子面板,我将使用" BorderLayout"," FlowLayout"和" BoxLayout"。通过将GUI的小部分划分为子面板,并使用最简单的布局来控制GUI的该部分,我们可以创建复杂,排列合理的显示,而不会因" GridBagLayout"的众多选项而感到头疼。另外,通过将类似显示功能的面板分组,它可以创建更具可读性的代码。

MiGLayout是GUI布局管理器,已被Java开发人员广泛使用。

我开始使用各种嵌套布局,然后移到GridBagLayout(这非常令人沮丧)。从那时起,我尝试了FormLayout(但是发现它除了表格之外不适合其他任何东西),并坚定地选择TableLayout,总体而言,我对此感到非常满意。

从那时起,我发现了MiGLayout,尽管除了使用它以外,我没有做太多其他事情,但它似乎非常强大,与TableLayout十分相似,并且可能更清洁。

对我来说,最大的好处是MiGLayout即将成为JDK的一部分,因此我打算在它使用时几乎完全使用它。

要记住的另一件事是,不管我们选择使用哪种重量级的LayoutManager,始终都会有一些更简单的布局管理器(例如GridLayout)放置在一个地方。我已经看到了使用GridBagLayout做的一些可怕的事情,使用更简单的布局管理器可以更轻松地完成。

嵌套BoxLayout和SpringLayout时,我90%的时间使用BorderLayout

我曾经使用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用于诸如布局之类的表单,将BorderLayout用于简单的布局,将FlowLayout用于水平图标/按钮的数量,水平图标/按钮之间具有一定的间隔。 Netbeans还是一个很好的GUI构建器,可以避免许多繁琐的布局编码,以节省时间。

我希望尽量减少对第三方库的依赖,因此对于对话框,通常使用BoxLayout;对于"复杂"布局,通常使用GridBagLayout。 GridBagLayout很容易理解,但是有点难以配置。我为自己编写了一个用于从HTML布局创建代码的工具(希望对其他人也有帮助):
http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy

我最近开始使用Swing,并且正在使用GridBagLayout。

GridBagLayout功能强大,但非常原始:连接布局的代码非常冗长。该实用程序库(实际上只有1个jar文件,其中包含约10个类)简化了许多工作: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();