为什么 GridLayout 以错误的方式拆分列?

Why Does GridLayout split the columns in wrong way?

在使用 GridLayout 时,我希望每一行都有自己的文本字段来输入值。 在每个文本字段附近,我添加了一个空标签,用于使用红色 "x" 指示给定值是否正确(取决于我可能拥有的功能和其他条件)。 尝试更改行数和列数以匹配我实际添加的内容

    pnlTop=new JPanel(new GridLayout(0,2));
    // Username
    lblUserName = new JLabel("Username:");
    txtUserName = new JTextField(10);

    // Password
    lblPassword = new JLabel("Password:");
    txtPassword = new JPasswordField(5);

    // Retype Password
    lblRetype = new JLabel("Repeat Password:");
    txtRetype = new JPasswordField(5);

    // ID
    lblID = new JLabel("ID:");
    txtID = new JTextField(5);

    // Permission
    lblPermission = new JLabel("Permission");
    txtPermission = new JTextField(5);

    //Empty Labels
    lblX1 = new JLabel("");
    lblX2 = new JLabel("");
    lblX3 = new JLabel("");
    lblX4 = new JLabel("");



    // Top Panel - adding elements 
    pnlTop.add(lblUserName);
    pnlTop.add(lblX1);
    pnlTop.add(txtUserName);


    pnlTop.add(lblPassword);
    pnlTop.add(lblX2);
    pnlTop.add(txtPassword);

    pnlTop.add(lblRetype);
    pnlTop.add(lblX2);
    pnlTop.add(txtRetype);


    pnlTop.add(lblID);
    pnlTop.add(lblX3);
    pnlTop.add(txtID);


    pnlTop.add(lblPermission);
    pnlTop.add(lblX4);
    pnlTop.add(txtPermission);

    //  Bottom Panel -- Adding buttons
    pnlBottom = new JPanel(new FlowLayout());
    btnCancel = new JButton("Cancel");
    btnSignUp = new JButton("Sign UP");

    pnlBottom.add(btnCancel);
    btnCancel.addActionListener(this);
    pnlBottom.add(btnSignUp);
    btnSignUp.addActionListener(this);


    // adding focus listeners
    txtID.addFocusListener(this);
    txtPassword.addFocusListener(this);
    txtUserName.addFocusListener(this);
    txtRetype.addFocusListener(this);



    // General Panel - adding top and bottom panels
    pnlGeneral = new JPanel(new BorderLayout());
    pnlGeneral.add(pnlTop,BorderLayout.NORTH);
    pnlGeneral.add(pnlBottom,BorderLayout.SOUTH);

    // Setting size and location of screen
    setContentPane(pnlGeneral);
    setLocation(600, 400);
    setVisible(true);
    pack(); 

这是完整的代码,在另一个 class 中。 此时我将lblX1添加到pnlTop,网格断开。

我已经尝试更改 rows/columns 的数量,但没有成功,非常感谢任何帮助。

3 列的当前情况图片:

基本上我希望它看起来像这样

| Username:        | _____ |  |    
| Password:        | _____ |  |
| Repeat Password: | _____ |  |
| ID:              | _____ |  |
| Permission       | _____ |  |

在右侧的每个文本字段附近,将添加一个红色的 X(这就是为什么我留下一个空 space)的任何条件(已经具有该功能,但它们与此问题无关)

这里:

pnlTop=new JPanel(new GridLayout(0,2));

这为 两个 列创建了一个 "grid"。

但是你继续添加:

// Top Panel - adding elements 
pnlTop.add(lblUserName);
pnlTop.add(lblX1);
pnlTop.add(txtUserName);

列。我将从以下内容开始:

// Top Panel - adding elements 
pnlTop.add(lblUserName);
pnlTop.add(txtUserName);

我假设您打算使用这些 lblX... 来控制水平 "gapping"。但如果这样做,则必须使用 3 列网格!

但真正的答案是研究网格布局的可能性,因为这应该允许您以不同的方式控制列宽。喜欢玩 hgapvgap 设置(请参阅 "official" documentation 了解一些想法)。

含义:使用2列网格(就像你现在做的那样),每行只添加两个个元素,并通过相应的控件控制"gapping"网格布局的机制。

最终更新:

 pnlTop.add(lblX2);

那个出现了两次。事情是:你想要 5 行,每行有 3 列。所以你的网格布局需要说:3 列。并且:您应该添加 15 different UI 元素然后 (3 x 5)。您有 14 个,并且要将第二个 "separator" 添加两次。