向GridBagLayout添加组件会将其他组件向右移动

时间:2015-05-23 16:32:38

标签: java swing awt layout-manager gridbaglayout

当我尝试布置JPanel时,我看到一些非常奇怪的结果。在添加最后一个JTextField subline

之前,一切正常

correct layout before adding last JTextField

当我添加它时,它上方的JTextField向右移动,以便它从subline结束的地方开始:

incorrect layout after adding last JTextField

以下是创建此布局的代码:

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

    }
}

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

根据the docs for GridBagLayout

  

每个GridBagLayout对象维护一个动态的矩形单元格网格,每个组件占据一个或多个单元格,称为显示区域。

在您的代码中,您的网格有3行4列。您告诉每个组件只占用一个单元格,位于gridxgridy给出的位置。

你不喜欢他们中的一些“停止”或“开始”他们所做的事实表明你真的希望他们中的一些人占据多个单元格。

你很幸运! 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!