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) 来做到这一点 您的组件(JTextFieldJButton), 但是您没有对其他一些组件执行此操作(JLabels 和 JComboBox)。这就是为什么这些组件 仍然有 position/size 零,因此是不可见的。

现在我不建议你添加这些缺失的 .setBounds(...) 调用, 因为这会导致设计更加混乱。

改为执行以下操作:

  • 避免在 JFrameformFrame.setLayout(null)。 而是使用 formFrame.setLayout(new GridLayout(0, 2, 5, 5))。 这将以 grid-like 方式排列组件 有 2 列(按照您将它们添加到框架的顺序), 行和列之间由 5 个像素的间隙分隔。
  • 删除所有 .setBounds(...) 调用。 你不需要它们,因为这是布局管理器 可以做得更好。
  • 避免在 JComboBoxbloodType.setLayout(null), 因为这会使组合框的 drop-down 按钮 看不见。
  • 避免formFrame.setSize(500,500)。 而是使用 formFrame.pack()。这将导致布局 经理为您的组件提供计算的位置和尺寸。 (这就是为什么您需要在 .setLayout(...) 调用 之后 执行此操作)。

然后就是这个样子

我建议学习更多有关如何在 Swing 中布局组件的信息。 参见示例 this tutorial。 有了那里的技能,你甚至可能想进一步提高 你 JFrame.

的样子