Java Swing 没有按应有的方式显示组件
Java Swing not showing components as it should
我正在尝试为 Java 中的 class 编写 GUI 代码,但有些组件出现了,有些没有。恰好 JTextBoxes 和 JButton 出现了,但 JLabels 和 JComboBoxes 没有出现。另一个问题是,我试图删除 JComboBox 并放置 JTextBox,但是当我尝试键入血型 (es.O-) 并将其注册到对象 Donor d1 时,它给了我 NumberFormatException。我检查了 Donor class 并且属性 bloodType 是一个字符串,所以我不明白为什么它会给我这个错误
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DonationForm {
DonorTableImpl donorDB;
public DonationForm(DonorTableImpl donorDB){
this.donorDB=donorDB;
JFrame formFrame=new JFrame("Complete the form");
//TextBox Fields
JTextField id=new JTextField(10);
id.setBounds(140,190,150,30);
JTextField firstName=new JTextField(10);
firstName.setBounds(140,160,150,30);
JTextField lastName=new JTextField(10);
lastName.setBounds(140,130,150,30);
JTextField password=new JTextField(10);
password.setBounds(140,100,150,30);
JTextField address=new JTextField(10);
address.setBounds(140,70,150,30);
//Labels for TextBoxes
JLabel idLabel=new JLabel("Id");
JLabel firstNameLabel=new JLabel("First Name");
JLabel lastNameLabel=new JLabel("Last Name");
JLabel passwordLabel=new JLabel("Password");
JLabel addressLabel=new JLabel("Address");
JLabel bloodTypeLabel=new JLabel("Blood Type");
//ComboBox
String[] blood={"A+","A-","B+","B-","AB+","AB-","O+","O-"};
JComboBox bloodType=new JComboBox(blood);
bloodType.setSelectedIndex(0);
//Submit button
JButton submit=new JButton("SUBMIT");
submit.setBounds(190,300,100,30);
//Add all components on frame
formFrame.add(idLabel);
formFrame.add(id);
formFrame.add(firstNameLabel);
formFrame.add(firstName);
formFrame.add(lastNameLabel);
formFrame.add(lastName);
formFrame.add(passwordLabel);
formFrame.add(password);
formFrame.add(addressLabel);
formFrame.add(address);
formFrame.add(bloodTypeLabel);
formFrame.add(bloodType);
formFrame.add(submit);
formFrame.setSize(500,500);
bloodType.setVisible(true);
bloodType.setLayout(null);
formFrame.setLayout(null);
formFrame.setVisible(true);
//Create an Object with data gotten from TextBoxes when SUBMIT button is clicked
submit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Donor d1=new Donor(Integer.parseInt(id.getText()),firstName.getText(),
lastName.getText(),password.getText(),
address.getText(), blood[bloodType.getSelectedIndex()]);
donorDB.save(d1);
}
});
}
}
您需要将框架的布局设置为 null 以外的内容才能呈现所有组件。
而不是
formFrame.setLayout(null);
使用这个:
formFrame.setLayout(new FlowLayout(FlowLayout.CENTER, 1000, 10));
通过使用 formFrame.setLayout(null);
您选择不为 JFrame
使用 LayoutManager。
这通常是个坏主意,因为那样你就有责任了
用于设置组件的位置和大小。
你通过调用 .setBounds(x,y,width,height)
来做到这一点
您的组件(JTextField
和 JButton
),
但是您没有对其他一些组件执行此操作(JLabel
s
和 JComboBox
)。这就是为什么这些组件
仍然有 position/size 零,因此是不可见的。
现在我不建议你添加这些缺失的 .setBounds(...)
调用,
因为这会导致设计更加混乱。
改为执行以下操作:
- 避免在
JFrame
上 formFrame.setLayout(null)
。
而是使用 formFrame.setLayout(new GridLayout(0, 2, 5, 5))
。
这将以 grid-like 方式排列组件
有 2 列(按照您将它们添加到框架的顺序),
行和列之间由 5 个像素的间隙分隔。
- 删除所有
.setBounds(...)
调用。
你不需要它们,因为这是布局管理器
可以做得更好。
- 避免在
JComboBox
上 bloodType.setLayout(null)
,
因为这会使组合框的 drop-down 按钮
看不见。
- 避免
formFrame.setSize(500,500)
。
而是使用 formFrame.pack()
。这将导致布局
经理为您的组件提供计算的位置和尺寸。
(这就是为什么您需要在 .setLayout(...)
调用 之后 执行此操作)。
然后就是这个样子
我建议学习更多有关如何在 Swing 中布局组件的信息。
参见示例 this tutorial。
有了那里的技能,你甚至可能想进一步提高
你 JFrame
.
的样子
我正在尝试为 Java 中的 class 编写 GUI 代码,但有些组件出现了,有些没有。恰好 JTextBoxes 和 JButton 出现了,但 JLabels 和 JComboBoxes 没有出现。另一个问题是,我试图删除 JComboBox 并放置 JTextBox,但是当我尝试键入血型 (es.O-) 并将其注册到对象 Donor d1 时,它给了我 NumberFormatException。我检查了 Donor class 并且属性 bloodType 是一个字符串,所以我不明白为什么它会给我这个错误
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class DonationForm {
DonorTableImpl donorDB;
public DonationForm(DonorTableImpl donorDB){
this.donorDB=donorDB;
JFrame formFrame=new JFrame("Complete the form");
//TextBox Fields
JTextField id=new JTextField(10);
id.setBounds(140,190,150,30);
JTextField firstName=new JTextField(10);
firstName.setBounds(140,160,150,30);
JTextField lastName=new JTextField(10);
lastName.setBounds(140,130,150,30);
JTextField password=new JTextField(10);
password.setBounds(140,100,150,30);
JTextField address=new JTextField(10);
address.setBounds(140,70,150,30);
//Labels for TextBoxes
JLabel idLabel=new JLabel("Id");
JLabel firstNameLabel=new JLabel("First Name");
JLabel lastNameLabel=new JLabel("Last Name");
JLabel passwordLabel=new JLabel("Password");
JLabel addressLabel=new JLabel("Address");
JLabel bloodTypeLabel=new JLabel("Blood Type");
//ComboBox
String[] blood={"A+","A-","B+","B-","AB+","AB-","O+","O-"};
JComboBox bloodType=new JComboBox(blood);
bloodType.setSelectedIndex(0);
//Submit button
JButton submit=new JButton("SUBMIT");
submit.setBounds(190,300,100,30);
//Add all components on frame
formFrame.add(idLabel);
formFrame.add(id);
formFrame.add(firstNameLabel);
formFrame.add(firstName);
formFrame.add(lastNameLabel);
formFrame.add(lastName);
formFrame.add(passwordLabel);
formFrame.add(password);
formFrame.add(addressLabel);
formFrame.add(address);
formFrame.add(bloodTypeLabel);
formFrame.add(bloodType);
formFrame.add(submit);
formFrame.setSize(500,500);
bloodType.setVisible(true);
bloodType.setLayout(null);
formFrame.setLayout(null);
formFrame.setVisible(true);
//Create an Object with data gotten from TextBoxes when SUBMIT button is clicked
submit.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
Donor d1=new Donor(Integer.parseInt(id.getText()),firstName.getText(),
lastName.getText(),password.getText(),
address.getText(), blood[bloodType.getSelectedIndex()]);
donorDB.save(d1);
}
});
}
}
您需要将框架的布局设置为 null 以外的内容才能呈现所有组件。
而不是
formFrame.setLayout(null);
使用这个:
formFrame.setLayout(new FlowLayout(FlowLayout.CENTER, 1000, 10));
通过使用 formFrame.setLayout(null);
您选择不为 JFrame
使用 LayoutManager。
这通常是个坏主意,因为那样你就有责任了
用于设置组件的位置和大小。
你通过调用 .setBounds(x,y,width,height)
来做到这一点
您的组件(JTextField
和 JButton
),
但是您没有对其他一些组件执行此操作(JLabel
s
和 JComboBox
)。这就是为什么这些组件
仍然有 position/size 零,因此是不可见的。
现在我不建议你添加这些缺失的 .setBounds(...)
调用,
因为这会导致设计更加混乱。
改为执行以下操作:
- 避免在
JFrame
上formFrame.setLayout(null)
。 而是使用formFrame.setLayout(new GridLayout(0, 2, 5, 5))
。 这将以 grid-like 方式排列组件 有 2 列(按照您将它们添加到框架的顺序), 行和列之间由 5 个像素的间隙分隔。 - 删除所有
.setBounds(...)
调用。 你不需要它们,因为这是布局管理器 可以做得更好。 - 避免在
JComboBox
上bloodType.setLayout(null)
, 因为这会使组合框的 drop-down 按钮 看不见。 - 避免
formFrame.setSize(500,500)
。 而是使用formFrame.pack()
。这将导致布局 经理为您的组件提供计算的位置和尺寸。 (这就是为什么您需要在.setLayout(...)
调用 之后 执行此操作)。
然后就是这个样子
我建议学习更多有关如何在 Swing 中布局组件的信息。
参见示例 this tutorial。
有了那里的技能,你甚至可能想进一步提高
你 JFrame
.