JComboBox 在 GridBagLayout 中插入后更改 JTextField 宽度
JComboBox changes JTextField width after inserting in GridBagLayout
我想为一个人的出生日期添加 3 个组合框:一个是月,然后是日,然后是年。当我添加所有 3 个组合框时,它会更改 JTextFields
的宽度。非常感谢任何有关如何解决此问题的帮助。
还有没有更好的方法来添加 JComboBox
的月份,而不是一个一个地插入?
代码如下:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class Home extends JFrame {
private JButton btnClear, btnNext;
private JTextField txtName, txtAddress, txtCity, txtState,
txtZipCode, txtPhoneNumber, txtEmail;
private JComboBox txtDate, txtYear, txtMonth;
private JLabel labelName, labelAddress, labelCity, labelState,
labelZipCode, labelPhoneNumber, labelEmail, labelDOB;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Home().setVisible(true);
}
});
}
public Home() {
createView();
setTitle("Job Hiring Systems");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600, 500);
setMinimumSize(new Dimension(600, 500));
//pack();
setLocationRelativeTo(null);
setResizable(false);
}
private void createView() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
//panel.setBorder(new EmptyBorder(25,10,25,10));
getContentPane().add(panel);
/*
* North Panel
*/
JPanel northPanel = new JPanel();
northPanel.setBackground(Color.GRAY);
panel.add(northPanel, BorderLayout.NORTH);
JLabel labelWelcomeMessage = new JLabel("Welcome to the Job Hiring Systems");
labelWelcomeMessage.setFont(new Font("Serif", Font.BOLD, 25));
northPanel.add(labelWelcomeMessage, BorderLayout.CENTER);
/*
* End of North Panel
*/
/*
* Center Panel
*/
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.yellow);
centerPanel.setSize(300, 300);
GridBagLayout layout = new GridBagLayout();
centerPanel.setLayout(layout);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
labelName = new JLabel("Enter your name: ");
labelName.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelName, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
txtName = new JTextField(25);
txtName.setHorizontalAlignment(JTextField.CENTER);
txtName.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtName, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 1;
labelAddress = new JLabel("Enter your address: ");
labelAddress.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelAddress, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
txtAddress = new JTextField(25);
txtAddress.setHorizontalAlignment(JTextField.CENTER);
txtAddress.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtAddress, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 2;
labelCity = new JLabel("Enter your city: ");
labelCity.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelCity, gbc);
gbc.gridx = 1;
gbc.gridy = 2;
txtCity = new JTextField(25);
txtCity.setHorizontalAlignment(JTextField.CENTER);
txtCity.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtCity, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 3;
labelState = new JLabel("Enter your State: ");
labelState.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelState, gbc);
gbc.gridx = 1;
gbc.gridy = 3;
txtState = new JTextField(25);
txtState.setHorizontalAlignment(JTextField.CENTER);
txtState.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtState, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 4;
labelZipCode = new JLabel("Enter your Zip Code: ");
labelZipCode.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelZipCode, gbc);
gbc.gridx = 1;
gbc.gridy = 4;
txtZipCode = new JTextField(25);
txtZipCode.setHorizontalAlignment(JTextField.CENTER);
txtZipCode.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtZipCode, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 5;
labelPhoneNumber = new JLabel("Enter your Phone Number: ");
labelPhoneNumber.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelPhoneNumber, gbc);
gbc.gridx = 1;
gbc.gridy = 5;
txtPhoneNumber = new JTextField(25);
txtPhoneNumber.setHorizontalAlignment(JTextField.CENTER);
txtPhoneNumber.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtPhoneNumber, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 6;
labelEmail = new JLabel("Enter your Email: ");
labelEmail.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelEmail, gbc);
gbc.gridx = 1;
gbc.gridy = 6;
txtEmail = new JTextField(25);
txtEmail.setHorizontalAlignment(JTextField.CENTER);
txtEmail.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtEmail, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 7;
labelDOB = new JLabel("Enter your Date of Birth: ");
labelDOB.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelDOB, gbc);
gbc.gridx = 1;
txtMonth = new JComboBox();
txtMonth.addItem("January");
txtMonth.addItem("February");
txtMonth.addItem("March");
txtMonth.addItem("April");
txtMonth.addItem("May");
txtMonth.addItem("June");
txtMonth.addItem("July");
txtMonth.addItem("August");
txtMonth.addItem("September");
txtMonth.addItem("October");
txtMonth.addItem("November");
txtMonth.addItem("December");
centerPanel.add(txtMonth, gbc);
gbc.gridx = 2;
txtDate = new JComboBox();
for (int i = 0; i < 31; i++) {
txtDate.addItem(i);
}
centerPanel.add(txtDate, gbc);
gbc.gridx = 3;
txtYear = new JComboBox();
for (int i = 1940; i < 2017; i++) {
txtYear.addItem(i);
}
centerPanel.add(txtYear, gbc);
panel.add(centerPanel);
/*
* End of Center Panel
*/
/*
* South Panel
*/
JPanel southPanel = new JPanel();
southPanel.setBackground(Color.GREEN);
panel.add(southPanel, BorderLayout.SOUTH);
btnClear = new JButton("CLEAR");
southPanel.add(btnClear, BorderLayout.CENTER);
btnNext = new JButton("NEXT");
southPanel.add(btnNext, BorderLayout.WEST);
/*
* End of South Panel
*/
}
}
对于第二个问题,您可以直接创建包含月份数组的 JComboBox :
String[] months = {"January", ..., "December"}; // put all the months here
JComboBox txtMonth = new JComboBox(months);
编辑:
对于您的第一个问题:如果您希望每个 JTextField 的长度与三个 JComboBox 的总长度相同,那么您应该在添加任何 JTextField 之前写 gbc.gridwidth = 3;
。
更多看这里(主要是中间的例子,真的很清楚):https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
When I add all 3 combo boxes, it changes the width of the JTextFields. Any help on how to resolve this issue would be greatly appreciated.
GridBagLayout
中的每个组件默认占用 1 个单元格(一个 space 垂直和 1 个水平)。每次添加组合框时,都会增加网格中的列数,但文本字段仍采用 1 水平 space,与第一个组合框对齐。
您希望文本字段与最后一个组合框对齐,或者换句话说,采用网格中剩余的任何 space。您可以通过指定
来做到这一点
gbc.gridwidth = GridBagConstraints.REMAINDER;
用于您的文本字段。 (在你的情况下 gbc.gridwidth = 3
也可以,但如果你添加更多组件,你可能需要更改它。)
请注意,由于布局管理器将 space 分配给组件,因此在文本字段的构造函数中指定一个数字不会有太大作用,
Also is there a better way to add in the months for the JComboBox, instead of inserting it one by one.
是的,我建议您利用新的日期时间 API。有一个 Enum Month 已准备好您的常量。不要忘记为您的组合框指定通用类型:
JComboBox<Month> txtMonth = new JComboBox<>();
for (Month month : Month.values())
txtMonth.addItem(month);
我会让你自己更正大写(提示:getDisplayName
)。
我想为一个人的出生日期添加 3 个组合框:一个是月,然后是日,然后是年。当我添加所有 3 个组合框时,它会更改 JTextFields
的宽度。非常感谢任何有关如何解决此问题的帮助。
还有没有更好的方法来添加 JComboBox
的月份,而不是一个一个地插入?
代码如下:
import java.awt.*;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class Home extends JFrame {
private JButton btnClear, btnNext;
private JTextField txtName, txtAddress, txtCity, txtState,
txtZipCode, txtPhoneNumber, txtEmail;
private JComboBox txtDate, txtYear, txtMonth;
private JLabel labelName, labelAddress, labelCity, labelState,
labelZipCode, labelPhoneNumber, labelEmail, labelDOB;
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Home().setVisible(true);
}
});
}
public Home() {
createView();
setTitle("Job Hiring Systems");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600, 500);
setMinimumSize(new Dimension(600, 500));
//pack();
setLocationRelativeTo(null);
setResizable(false);
}
private void createView() {
JPanel panel = new JPanel();
panel.setLayout(new BorderLayout());
//panel.setBorder(new EmptyBorder(25,10,25,10));
getContentPane().add(panel);
/*
* North Panel
*/
JPanel northPanel = new JPanel();
northPanel.setBackground(Color.GRAY);
panel.add(northPanel, BorderLayout.NORTH);
JLabel labelWelcomeMessage = new JLabel("Welcome to the Job Hiring Systems");
labelWelcomeMessage.setFont(new Font("Serif", Font.BOLD, 25));
northPanel.add(labelWelcomeMessage, BorderLayout.CENTER);
/*
* End of North Panel
*/
/*
* Center Panel
*/
JPanel centerPanel = new JPanel();
centerPanel.setBackground(Color.yellow);
centerPanel.setSize(300, 300);
GridBagLayout layout = new GridBagLayout();
centerPanel.setLayout(layout);
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 0;
labelName = new JLabel("Enter your name: ");
labelName.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelName, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
txtName = new JTextField(25);
txtName.setHorizontalAlignment(JTextField.CENTER);
txtName.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtName, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 1;
labelAddress = new JLabel("Enter your address: ");
labelAddress.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelAddress, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
txtAddress = new JTextField(25);
txtAddress.setHorizontalAlignment(JTextField.CENTER);
txtAddress.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtAddress, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 2;
labelCity = new JLabel("Enter your city: ");
labelCity.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelCity, gbc);
gbc.gridx = 1;
gbc.gridy = 2;
txtCity = new JTextField(25);
txtCity.setHorizontalAlignment(JTextField.CENTER);
txtCity.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtCity, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 3;
labelState = new JLabel("Enter your State: ");
labelState.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelState, gbc);
gbc.gridx = 1;
gbc.gridy = 3;
txtState = new JTextField(25);
txtState.setHorizontalAlignment(JTextField.CENTER);
txtState.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtState, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 4;
labelZipCode = new JLabel("Enter your Zip Code: ");
labelZipCode.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelZipCode, gbc);
gbc.gridx = 1;
gbc.gridy = 4;
txtZipCode = new JTextField(25);
txtZipCode.setHorizontalAlignment(JTextField.CENTER);
txtZipCode.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtZipCode, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 5;
labelPhoneNumber = new JLabel("Enter your Phone Number: ");
labelPhoneNumber.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelPhoneNumber, gbc);
gbc.gridx = 1;
gbc.gridy = 5;
txtPhoneNumber = new JTextField(25);
txtPhoneNumber.setHorizontalAlignment(JTextField.CENTER);
txtPhoneNumber.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtPhoneNumber, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 6;
labelEmail = new JLabel("Enter your Email: ");
labelEmail.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelEmail, gbc);
gbc.gridx = 1;
gbc.gridy = 6;
txtEmail = new JTextField(25);
txtEmail.setHorizontalAlignment(JTextField.CENTER);
txtEmail.setHorizontalAlignment(SwingConstants.LEFT);
centerPanel.add(txtEmail, gbc);
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridx = 0;
gbc.gridy = 7;
labelDOB = new JLabel("Enter your Date of Birth: ");
labelDOB.setFont(new Font("Serif", Font.PLAIN, 15));
centerPanel.add(labelDOB, gbc);
gbc.gridx = 1;
txtMonth = new JComboBox();
txtMonth.addItem("January");
txtMonth.addItem("February");
txtMonth.addItem("March");
txtMonth.addItem("April");
txtMonth.addItem("May");
txtMonth.addItem("June");
txtMonth.addItem("July");
txtMonth.addItem("August");
txtMonth.addItem("September");
txtMonth.addItem("October");
txtMonth.addItem("November");
txtMonth.addItem("December");
centerPanel.add(txtMonth, gbc);
gbc.gridx = 2;
txtDate = new JComboBox();
for (int i = 0; i < 31; i++) {
txtDate.addItem(i);
}
centerPanel.add(txtDate, gbc);
gbc.gridx = 3;
txtYear = new JComboBox();
for (int i = 1940; i < 2017; i++) {
txtYear.addItem(i);
}
centerPanel.add(txtYear, gbc);
panel.add(centerPanel);
/*
* End of Center Panel
*/
/*
* South Panel
*/
JPanel southPanel = new JPanel();
southPanel.setBackground(Color.GREEN);
panel.add(southPanel, BorderLayout.SOUTH);
btnClear = new JButton("CLEAR");
southPanel.add(btnClear, BorderLayout.CENTER);
btnNext = new JButton("NEXT");
southPanel.add(btnNext, BorderLayout.WEST);
/*
* End of South Panel
*/
}
}
对于第二个问题,您可以直接创建包含月份数组的 JComboBox :
String[] months = {"January", ..., "December"}; // put all the months here
JComboBox txtMonth = new JComboBox(months);
编辑:
对于您的第一个问题:如果您希望每个 JTextField 的长度与三个 JComboBox 的总长度相同,那么您应该在添加任何 JTextField 之前写 gbc.gridwidth = 3;
。
更多看这里(主要是中间的例子,真的很清楚):https://docs.oracle.com/javase/tutorial/uiswing/layout/gridbag.html
When I add all 3 combo boxes, it changes the width of the JTextFields. Any help on how to resolve this issue would be greatly appreciated.
GridBagLayout
中的每个组件默认占用 1 个单元格(一个 space 垂直和 1 个水平)。每次添加组合框时,都会增加网格中的列数,但文本字段仍采用 1 水平 space,与第一个组合框对齐。
您希望文本字段与最后一个组合框对齐,或者换句话说,采用网格中剩余的任何 space。您可以通过指定
来做到这一点gbc.gridwidth = GridBagConstraints.REMAINDER;
用于您的文本字段。 (在你的情况下 gbc.gridwidth = 3
也可以,但如果你添加更多组件,你可能需要更改它。)
请注意,由于布局管理器将 space 分配给组件,因此在文本字段的构造函数中指定一个数字不会有太大作用,
Also is there a better way to add in the months for the JComboBox, instead of inserting it one by one.
是的,我建议您利用新的日期时间 API。有一个 Enum Month 已准备好您的常量。不要忘记为您的组合框指定通用类型:
JComboBox<Month> txtMonth = new JComboBox<>();
for (Month month : Month.values())
txtMonth.addItem(month);
我会让你自己更正大写(提示:getDisplayName
)。