Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将java中的GUI组件放在中心位置?_Java_Swing_Layout Manager - Fatal编程技术网

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

如何将java中的GUI组件放在中心位置?,java,swing,layout-manager,Java,Swing,Layout Manager,我正在尝试创建一个迷你表单,它应该是这样的: 到目前为止,我得到了这个: 问题是我需要从左边有一个间隙,这样我的身体才会在中间,但我不知道如何做到这一点 我的代码: public class Person extends ClubAbstractEntity { protected String id; protected String name; protected String surname; protected String tel;

我正在尝试创建一个迷你表单,它应该是这样的:

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

问题是我需要从左边有一个间隙,这样我的身体才会在中间,但我不知道如何做到这一点

我的代码:

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

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

//addToCenter(container);
JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add(container, new GridBagConstraints());
addToCenter(wrapper);
现在,“容器”面板将位于“包装器”面板的中心,包装器面板将填充框架中的所有可用空间。阅读上Swing教程中的部分

关于使用weightx/weighty约束的一节将解释为什么这样做有效

编辑:

另一个选项是在父面板上使用
边框。边框允许您保留空间或向零部件添加高光。在这种情况下,您可以使用
EmptyBorder
。有关更多信息和示例,请阅读上Swing教程的部分


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

写得好的问题和写得好的代码!干得好1)
setSize(450220)不过是猜测而已。即使这种猜测在一台机器(JRE、PLAF等)上是正确的,在其他机器上也是错误的。相反,如第一个答案所示,使用
GridBagLayout
将面板居中,添加
EmptyBorder
作为空白,然后
pack()。2) 为了更快地获得更好的帮助,请添加or。设置大小(450220)是我得到的一个要求,这就是我这样设置的原因。示例GUI是460x230。顺便说一句-上次忘记添加。。3) Java GUI必须在不同的操作系统、屏幕大小、屏幕分辨率等上工作,在不同的地区使用不同的PLAF。因此,它们不利于像素完美布局。使用布局管理器,或者与布局填充和边框一起使用。有没有办法只使用GridLayout和FlowLayout?甚至是BorderLayout?@LiavC,每个布局管理器都有不同的规则。Flow布局允许您水平居中,但不允许垂直居中(您仍然需要将其用作包装面板)。您已经在使用BorderLayout,但它不起作用(这就是您提出此问题的原因),那么您为什么还要再次建议它呢?正如我在答案顶部所述,这是最简单的解决方案!这是两行代码。这个简单的解决方案有什么问题?使用不同布局管理器嵌套面板是布局管理的方式。它简化了代码,使其更易于维护和阅读。@LiavC,请参阅编辑。
//addToCenter(container);
JPanel wrapper = new JPanel( new GridBagLayout() );
wrapper.add(container, new GridBagConstraints());
addToCenter(wrapper);