如何将 GUI 组件放置在 java 的中央?

How to place GUI components in java in the center?

我正在尝试创建一个迷你表单,它应该看起来像这样:

到目前为止我得到了这个:

问题是我需要从左边有这个空隙,这样我的表格就会居中,但我不知道如何实现。

我的代码:

public class Person extends ClubAbstractEntity
{
    protected String id;
    protected String name;
    protected String surname;
    protected String tel;
    
    public Person(String id,String name,String surname,String tel)
    {
        this.id=id;
        this.name=name;
        this.surname=surname;
        this.tel=tel;
        JLabel[] labels={new JLabel("Id", JLabel.RIGHT),new JLabel("Name", JLabel.RIGHT),new JLabel("Surname", JLabel.RIGHT),new JLabel("Tel", JLabel.RIGHT)};
        JTextField[] textFields=new JTextField[labels.length];
        JPanel container=new JPanel();
        container.setLayout(new BorderLayout());
        JPanel labelPanel = new JPanel(new GridLayout(labels.length, 1));
        JPanel fieldPanel = new JPanel(new GridLayout(labels.length, 1));
        container.add(labelPanel, BorderLayout.WEST);
        container.add(fieldPanel, BorderLayout.CENTER);
        
        for(int i=0;i<labels.length;i++)
        {
            
            //container.add(labels[i]);
            
            textFields[i]=new JTextField(30);
            labels[i].setLabelFor(textFields[i]);
            labelPanel.add(labels[i]);
            
            JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
            
            p.add(textFields[i]);
            fieldPanel.add(p);
            //container.add(textFields[i]);
        }
        
        setSize(450,220);
        addToCenter(container);
    }

它使用名为 addToCenter 的父方法(一个 class 扩展 JFrame)方法,它获取一个 GUI 组件并将其添加到中心。

protected void addToCenter(Component guiComponent)
{
    add(guiComponent,BorderLayout.CENTER);
}

最简单的方法是使用包装面板,该面板使用 GridBagLayout 和默认 GridBagConstraints

//addToCenter(container);
JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add(container, new GridBagConstraints());
addToCenter(wrapper);

现在,“容器”面板将位于“包装器”面板的中心,并且包装器面板将填充框架中所有可用的 space。阅读 How to Use GridBagLayout

上的 Swing 教程部分

有关使用 weightx/weighty 约束的部分将解释其工作原理。

编辑:

另一种选择是在父面板上使用 Border。 Border 允许您保留 space 或向组件添加高亮显示。在这种情况下,您可以使用 EmptyBorder。阅读有关 How to Use Borders 的 Swing 教程部分,了解更多信息和示例。

这两种解决方案的不同之处在于,边框是固定尺寸的,如果框架不可调整大小,它也能正常工作。如果框架可调整大小,则“包装器”面板解决方案效果很好,因为随着框架调整大小时,面板将持续居中 space 可用。