如何将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);