为什么 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 列网格!
但真正的答案是研究网格布局的可能性,因为这应该允许您以不同的方式控制列宽。喜欢玩 hgap
和 vgap
设置(请参阅 "official" documentation 了解一些想法)。
含义:使用2列网格(就像你现在做的那样),每行只添加两个个元素,并通过相应的控件控制"gapping"网格布局的机制。
最终更新:
pnlTop.add(lblX2);
那个出现了两次。事情是:你想要 5 行,每行有 3 列。所以你的网格布局需要说:3 列。并且:您应该添加 15 different UI 元素然后 (3 x 5)。您有 14 个,并且要将第二个 "separator" 添加两次。
在使用 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 列网格!
但真正的答案是研究网格布局的可能性,因为这应该允许您以不同的方式控制列宽。喜欢玩 hgap
和 vgap
设置(请参阅 "official" documentation 了解一些想法)。
含义:使用2列网格(就像你现在做的那样),每行只添加两个个元素,并通过相应的控件控制"gapping"网格布局的机制。
最终更新:
pnlTop.add(lblX2);
那个出现了两次。事情是:你想要 5 行,每行有 3 列。所以你的网格布局需要说:3 列。并且:您应该添加 15 different UI 元素然后 (3 x 5)。您有 14 个,并且要将第二个 "separator" 添加两次。