9

在此处输入图像描述

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

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

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

任何帮助表示赞赏。目标是确保姓名组件行和出生日期组件行垂直展开,姓名组件在上半部分垂直居中,出生日期组件在下半部分垂直居中。如果有什么听起来令人困惑,请告诉我,我会尝试重新措辞以便更好地理解。

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

4

4 回答 4

9

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

编辑:

这是一个小例子:

在此处输入图像描述

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);
    }
}
于 2012-11-28T23:31:38.003 回答
3

我强烈建议你远离设计为由布局管理器自动化的布局——它们可以很灵活,但它们往往被用作锤子,如果你想让组件在自然的方式。

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

在您的情况下,我认为您可以很好地使用 3 个流布局,两个水平包含在一个垂直中,这种 GUI 正是 flowLayout 的用途,您不必添加任何参数。

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

编辑:这是嵌套在盒子布局中的两个流布局的一些工作代码。

它是 groovy(不是 java),但不同之处在于纯粹的语法——杂乱无章。

请注意要发明的简单性和缺乏数字——它的工作原理与您预期的非常相似。

导入 javax.swing.*
导入 java.awt.*

f=新的 JFrame()
f.setSize(300,200)
p=f.getContentPane()
p.setLayout(新 BoxLayout(p, BoxLayout.Y_AXIS))
p.add(panel("按钮 1"))
p.add(panel("按钮 2"))
f.show()

无效添加面板(名称){
   def child=new JPanel()
   child.add(新的 JButton(名称))
   child.add(新的 JTextField(20))
   返回孩子
}
于 2012-11-28T23:24:01.400 回答
2

我个人喜欢GridBagLayout

这是一个示例来演示:

在此处输入图像描述

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);
    }
}
于 2012-11-28T23:04:56.237 回答
1

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

于 2012-11-28T23:06:27.563 回答