如何正确使用网格布局?

时间:2019-04-29 11:31:58

标签: java grid-layout

我想要一个网格布局,每一行都有一个文本字段来输入值。 在每个文本字段附近,我添加了一个空标签。 试图更改行数和列数以匹配我实际添加的内容

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

这是完整的代码,位于不同的类中。 现在,我将lblX1添加到pnlTop中,网格破裂。

我试图更改行数/列数,但没有成功,我非常感谢提供任何帮助。

3列当前情况的图像:

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:1)

这里:

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

这将为两个列创建一个“网格”。

但是您继续添加:

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

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

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

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

但是真正的答案是研究网格布局的可能性,因为这应该允许您以不同的方式控制列宽。就像玩hgapvgap设置一样(有关一些想法,请参见“官方” documentation)。

含义:使用2列网格(如您现在所做的那样),并且每行仅添加两个元素,并通过网格布局的相应控制机制控制“间隙”。 / p>

最终更新:

 pnlTop.add(lblX2);

该人出现两次。问题是:您希望有 5 行,每行分别具有 3 列。因此,您的网格布局需要说:3列。并且:您应该添加15个不同 UI元素,然后(3 x 5)。您有14,并且要添加第二个“分隔符”两次。