你使用哪种布局管理器?

时间:2008-09-22 19:27:48

标签: java swing layout

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

22 个答案:

答案 0 :(得分:17)

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

答案 1 :(得分:9)

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

答案 2 :(得分:7)

MiG和FormLayout(JGoodies)都非常适合手动布局(并且几乎所有布局最终都变为手动)。我最大的建议是设计你的视图,这样你就可以完全删除布局并重新实现它,而不会影响你的应用程序(这里很好地分离了视图和控制器)。

绝对可以看一下JGoodie的PresentationModel方法来实现'哑'视图。我将这种技术与GUI构建器(我使用GroupLayout和Jigloo GUI构建器插件)一起用于抛弃快速原型。经过3或4次迭代后,通常会出现窗口,我们使用MiG或FormLayout重新实现。

编辑:自从我写这篇文章以来,我已经开始将MiG用于我的所有布局,并且我不再使用GUI构建器 - 使用MiG进行布局非常容易。

答案 3 :(得分:5)

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

答案 4 :(得分:5)

我对大部分面板使用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有一些独特的功能(例如“智能垂直调整大小”)。

答案 5 :(得分:5)

我使用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 ) );
    }

答案 6 :(得分:5)

我非常喜欢使用TableLayout而不是GridBagLayout。一切都是有道理的,而每当我尝试使用GridBagLayout时,它都会粉碎我的灵魂。

答案 7 :(得分:5)

我使用GridBagLayout。它似乎需要很多代码,但它使得布局非常好看。

我还希望将BorderLayout与GridBagLayout面板结合起来,以实现出色的可定制性。

答案 8 :(得分:3)

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

答案 9 :(得分:2)

总的来说,你可能会发现我在太阳下写的一篇文章很有用。它不是最新的布局管理器,但它集中在布局管理器的有效嵌套,而不是尝试用一个布局做所有事情。

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

答案 10 :(得分:2)

我发现对于任何非平凡的GUI,我使用带有嵌套子面板的多个布局,其中主面板可能有GridBagLayout和每个子面板(通常没有边框或指示它是面板)尽可能使用更简单的布局。通常,我会将BorderLayoutFlowLayoutBoxLayout用于更小,更简单的子面板。通过将GUI的小部分划分为子面板并使用最简单的布局来控制GUI的这一部分,您可以创建复杂,布局合理的显示,而不必担心GridBagLayout的许多选项。此外,通过将类似显示功能分组到面板中,它可以创建更易读的代码。

答案 11 :(得分:1)

我一直是GridBagLayout的忠实粉丝。它类似于HTML表格,因此对于那些网络程序员来说是直观的。

答案 12 :(得分:1)

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

答案 13 :(得分:1)

我开始使用各种嵌套布局,然后转移到GridBagLayout(这非常令人沮丧)。从那以后我尝试了FormLayout(但发现它不适合除了表格以外的任何东西)并坚定地坚持使用TableLayout,这对我来说非常满意。

从那以后我发现了MiGLayout,虽然我没有做太多的事情,但它似乎非常有能力,非常类似于TableLayout,可能还有点清洁。

对我来说最重要的是MiGLayout将成为JDK的一部分,因此我打算在它出现时几乎完全使用它。

要记住的另一件事是,无论你选择哪种重量级的LayoutManager,总会有一些更简单的布局管理器,比如GridLayout。我已经看到GridBagLayout做了一些可怕的事情,可以通过更简单的布局管理器轻松完成。

答案 14 :(得分:1)

为pbeissa gui builder开发的

Spring layout是netbeans的一部分。

答案 15 :(得分:1)

我更喜欢最小化对第三方库的依赖性,因此对于对话框通常是BoxLayout,对于“复杂”布局通常是GridBagLayout。 GridBagLayout很容易理解,但有点难以配置。我自己写了一个从HTML布局创建代码的工具(希望也可以帮助其他人): http://www.onyxbits.de/content/blog/patrick/java-gui-building-gridbaglayout-manager-made-easy

答案 16 :(得分:0)

我找到的唯一布局管理器,我实际上喜欢Relative Layout Manager。相对布局管理器的工作方式与概念组织的对话框的方式一致。一个缺点是,这个布局管理器处理附加约束。 似乎处理比率限制。幸运的是它设计得很好,我能够实现这个功能。

答案 17 :(得分:0)

我在嵌套BorderLayoutBoxLayout

的过程中90%的时间使用SpringLayout

答案 18 :(得分:0)

我是一个Java新手。

我尝试了GridBagLayout,放弃了,然后尝试了BoxLayout,然后放弃了,然后让自己的Custom Layout工作了。使用GridBag和Box我最好的猜测,布局引擎决定做一些不同的事情,没有任何明显的方法来调试它们。

通过我的自定义布局,我可以打印出坐标,宽度和高度,以找出它出错的地方。它有点蹩脚放置东西,但你已经掌握了java的全部功能,而不是其中一个内置布局管理器的有限词汇。

当然,这只是一个家庭项目,你永远不会被允许在工作中这样做。

答案 19 :(得分:0)

我使用GridBagLayout作为布局的形式,使用BorderLayout进行简单的布局,使用FlowLayout作为水平图标/按钮的数量,两者之间有一些空格。 Netbeans也是一个很好的GUI构建器,可以避免大量繁琐的布局编码来节省您的时间。

答案 20 :(得分:0)

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

答案 21 :(得分:0)

我厌倦了那些需要很多设置的布局管理员,不是很容易阅读或用手工做的,所以我写了自己非常简单的laoutmanager,它使用两个光电传感器的抽象来保持每个组件的位置。您可以像这样添加您的组件:parent.add(child,"topleft(0, 0.5)bottomright(0.5,1.0)");

看看这里https://github.com/hageldave/UsefulStuff/blob/master/src/PhotoCornersLayout.java;) 你自己应该对正确的布局做出反应,因为它不会检查你的布局的重叠或其他缺点。