当我尝试布置JPanel
时,我看到一些非常奇怪的结果。在添加最后一个JTextField
subline
:
当我添加它时,它上方的JTextField
向右移动,以便它从subline
结束的地方开始:
以下是创建此布局的代码:
public class Opspanel extends JPanel{
private static final long serialVersionUID = -6393281054430179953L;
public Opspanel() {
GridBagLayout layout = new GridBagLayout();
setLayout(layout);
GridBagConstraints constraints = new GridBagConstraints();
constraints.gridx = 0;
constraints.gridy = 0;
constraints.anchor = GridBagConstraints.LINE_START;
add(new JLabel("Vendor ID"), constraints);
constraints.gridx = 1;
constraints.gridy = 0;
constraints.anchor = GridBagConstraints.LINE_START;
JTextField vendorid = new JTextField();
vendorid.setPreferredSize(new Dimension(100,20));
add(vendorid, constraints);
constraints.gridx = 0;
constraints.gridy = 1;
constraints.anchor = GridBagConstraints.LINE_START;
add(new JLabel("Email Date"), constraints);
constraints.gridx = 1;
constraints.gridy = 1;
constraints.anchor = GridBagConstraints.LINE_START;
JTextField emaildate = new JTextField();
emaildate.setPreferredSize(new Dimension(100,20));
add(emaildate, constraints);
constraints.gridx = 2;
constraints.gridy = 1;
constraints.anchor = GridBagConstraints.LINE_START;
add(new JLabel("Email Time"), constraints);
constraints.gridx = 3;
constraints.gridy = 1;
constraints.anchor = GridBagConstraints.LINE_START;
JTextField emailtime = new JTextField();
emailtime.setPreferredSize(new Dimension(100,20));
add(emailtime, constraints);
constraints.gridx = 0;
constraints.gridy = 2;
constraints.anchor = GridBagConstraints.LINE_START;
add(new JLabel("Subject Line"), constraints);
constraints.gridx = 1;
constraints.gridy = 2;
constraints.anchor = GridBagConstraints.LINE_START;
JTextField subline = new JTextField();
subline.setPreferredSize(new Dimension(500, 20));
add(subline, constraints);
}
}
我该如何解决这个问题?
答案 0 :(得分:3)
每个
GridBagLayout
对象维护一个动态的矩形单元格网格,每个组件占据一个或多个单元格,称为显示区域。
在您的代码中,您的网格有3行4列。您告诉每个组件只占用一个单元格,位于gridx
和gridy
给出的位置。
你不喜欢他们中的一些“停止”或“开始”他们所做的事实表明你真的希望他们中的一些人占据多个单元格。
你很幸运! GridBagLayout
可以做到这一点。您正在寻找GridBagLayout.gridwidth
:
指定组件显示区域的行中的单元格数。
使用
REMAINDER
指定组件的显示区域将从gridx
到行中的最后一个单元格。使用RELATIVE
指定组件的显示区域将从gridx
到其行中最后一个的旁边。
gridwidth
应为非负数,默认值为1。
在您的示例中,您将“主题行”文本字段放在第二列(gridx = 1
)中。由于您将gridwidth
保留为其默认值1
,因此该文本字段不能与第三列或第四列重叠。因此,如果它增长,整个列必须随之增长。
通过让它覆盖多个网格单元,可以让它填满整个水平空间。 (如果您熟悉Microsoft Excel或Microsoft Word或类似程序中的表,则类似于“合并单元格”选项。)
使其覆盖3列,从gridx = 1
开始:
constraints.gridx = 1;
constraints.gridwidth = 3;
或者,要使其覆盖从列gridx = 1
到右侧的所有单元格:
constraints.gridx = 1;
constraints.gridwidth = GridBagLayout.REMAINDER;
在使用它添加另一个应该只覆盖一列的组件之前,不要忘记将gridwidth
重置为1!