微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何将java中的GUI组件居中放置?

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

like this

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

my form

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

我的代码

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",new JLabel("Surname",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);
    }

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

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

解决方法

最简单的方法是使用包装面板,该面板使用带有默认 GridBagLayoutGridBagConstraints

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

现在“容器”面板将在“包装器”面板内居中,包装器面板将填充框架中的所有可用空间。阅读 How to Use GridBagLayout

上的 Swing 教程中的部分

关于使用 weightx/weighty 约束的部分将解释为什么会这样。

编辑:

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

这两种解决方案的区别在于 Border 是固定大小的,如果框架不可调整大小,则可以正常工作。如果框架可调整大小,则“包装器”面板解决方案效果很好,因为在调整框架大小时,面板将持续在可用空间中居中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。