有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将组件添加到我的GridBagLayout会将其他组件移到最右边

当我试图展示我的JPanel时,我看到了一些非常奇怪的结果。在添加最后一个JTextField{}之前,一切正常:

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) 个答案

  1. # 1 楼答案

    根据the docs for ^{}

    Each GridBagLayout object maintains a dynamic, rectangular grid of cells, with each component occupying one or more cells, called its display area.

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

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

    你真走运GridBagLayout可以做到这一点。您正在寻找^{}

    Specifies the number of cells in a row for the component's display area.

    Use REMAINDER to specify that the component's display area will be from gridx to the last cell in the row. Use RELATIVE to specify that the component's display area will be from gridx to the next to the last one in its row.

    gridwidth should be non-negative and the default value is 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