什么是最好的布局管理器?

时间:2012-11-28 22:06:33

标签: java swing layout-manager

enter image description here

我想做一个看起来像上面的gui。现在我有一个面板,它将保存名称标签,名称文本字段,brith日期标签和生日文本字段。我的问题是什么是最好的布局管理器在面板上使用,以便“名称组件”行(标签+文本字段)和“出生日期组件”行(标签+文本字段),将垂直均匀地分布在小组。

我考虑过使用流布局,但这会导致两行组件之间没有间隙。我想过使用网格布局,但我不知道两行组件之间的间隙大小。

一种更复杂的方法......我想过将名称标签和文本字段放在一个面板中,并将出生日期标签和文本字段放在另一个面板中,然后使基本面板边框布局和设置名称为北,生日到南方...但是我仍然需要确保名称组件在名称面板中垂直居中,而生日组件在出生日期面板中垂直居中。

感谢任何帮助。目标是确保名称组件行和出生日期组件行垂直展开,名称组件垂直居中于上半部分,出生日期组件垂直居中于下半部分。如果有什么问题让人感到困惑,请告诉我,我会尝试改写,以便更好地理解。

我正在使用严格的Java swing与eclipse,没有GUI构建器或类似的东西。

4 个答案:

答案 0 :(得分:9)

我喜欢MigLayout。在这种情况下,布局组件将非常容易,因为MigLayout具有类似于表的行为,并且组件将以这种方式排列。这在QuickStartGuide

中有所描述

编辑:

这是一个小例子:

enter image description here

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import net.miginfocom.swing.MigLayout;

public class Test {

    private JFrame frame;
    private JTextField nameTextField, birthDateTextField;
    private JLabel nameLabel, birthDateLabel;

    public Test() {
        initComponents();
    }

    public static void main(String args[]) {
        new Test();
    }

    private void initComponents() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new MigLayout());

        nameTextField = new JTextField(30);
        birthDateTextField = new JTextField(30);
        nameLabel = new JLabel("Name:");
        birthDateLabel = new JLabel("Birth Date:");

        frame.add(nameLabel);
        frame.add(nameTextField, "wrap");
        frame.add(birthDateLabel);
        frame.add(birthDateTextField);
        frame.pack();
        frame.setVisible(true);
    }
}

答案 1 :(得分:3)

我强烈建议你远离布局经理设计的自动布局 - 它们可以灵活但是它们往往被用作锤子,如果你想要组件,它会非常笨拙以自然的方式调整大小。

学习使用布局管理器是一门艺术。你不会只挑选一个并将其用于解决每个问题,而是采用几种不同的类型并以类似于数据的方式嵌套它们。

在你的情况下,我认为你与3个流程布局相处得很好,两个水平包含在一个垂直中,那种GUI正是flowLayout的用途,你不必添加任何参与的参与

顺便说一句,通过嵌套边框和流布局可以解决很多问题 - 边框可以非常有用,因为中间的方式可以占用尽可能多的空间,但是留下4个边的空间他们需要 - 事实上BorderLayout通常只有2或3个区域填充 - 但可能很容易嵌套其他边框或流布局。这些导致GUI需要非常少的放置细节但仍然自然调整大小。

编辑: 以下是嵌套在框布局中的两个流布局的一些工作代码。

它是groovy(不是java),但区别在于纯语法 - 杂乱少。

注意发明的简单和缺乏数字 - 它的工作方式与您期望的非常相似。

import javax.swing.*
import java.awt.*

f=new JFrame()
f.setSize(300,200)
p=f.getContentPane()
p.setLayout(new BoxLayout(p, BoxLayout.Y_AXIS))
p.add(panel("Button 1"))
p.add(panel("Button 2"))
f.show()

void addPanel(name) {
   def child=new JPanel()
   child.add(new JButton(name))
   child.add(new JTextField(20))
   return child
}

答案 2 :(得分:2)

我个人喜欢GridBagLayout

以下是一个示例:

enter image description here

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UIManager.LookAndFeelInfo;

public class Test {

    private JFrame frame;
    private JTextField nameTextField, birthDateTextField;
    private JLabel nameLabel, birthDateLabel;

    public Test() {
        initComponents();
    }

    public static void main(String args[]) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                        if ("Nimbus".equals(info.getName())) {
                            UIManager.setLookAndFeel(info.getClassName());
                            break;
                        }
                    }
                } catch (Exception e) {
                    // If Nimbus is not available, you can set the GUI to another look and feel.
                }
                new Test();
            }
        });
    }

    private void initComponents() {
        frame = new JFrame("Test");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLayout(new GridBagLayout());

        nameTextField = new JTextField(30);
        birthDateTextField = new JTextField(30);
        nameLabel = new JLabel("Name:");
        birthDateLabel = new JLabel("Birth Date:");

        GridBagConstraints gc = new GridBagConstraints();
        gc.fill = GridBagConstraints.HORIZONTAL;
        gc.insets = new Insets(10, 10, 10, 10);

        gc.gridx = 0;
        gc.gridy = 0;
        frame.add(nameLabel, gc);

        gc.gridx = 1;
        gc.gridy = 0;
        frame.add(nameTextField, gc);

        gc.gridx = 0;
        gc.gridy = 1;
        frame.add(birthDateLabel, gc);

        gc.gridx = 1;
        gc.gridy = 1;
        frame.add(birthDateTextField, gc);

        frame.pack();
        frame.setVisible(true);
    }
}

答案 3 :(得分:1)

GroupLayout适合您的需求。看看吧。它具有自动创建间隙的能力(或者您可以管理自己的间隙),它非常适合创建表单。它可以水平或垂直工作。