繁体   English   中英

Java Swing 没有显示应有的组件

[英]Java Swing not showing components as it should

我正在尝试为 Java 中的 class 编写 GUI,一些组件出现但有些没有。 准确地说,JTextBoxes 和 JButton 出现了,但 JLabels 和 JComboBoxes 没有出现。 另一个问题是我试图删除 JComboBox 并放置 JTextBox,但是当我尝试输入血型(es.O-)并将其注册到 object 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 这通常是个坏主意,因为那时您要负责设置组件的位置和大小。 您通过为某些组件( JTextFieldJButton )调用.setBounds(x,y,width,height)来完成此操作,但您没有为其他一些组件( JLabelJComboBox )执行此操作。 这就是为什么这些组件的位置/大小仍然为零,因此是不可见的。

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

而是执行以下操作:

  • 避免在 JFrame 上使用JFrame formFrame.setLayout(null) 而是使用formFrame.setLayout(new GridLayout(0, 2, 5, 5)) 这将以类似网格的方式排列组件,有 2 列(按照您将它们添加到框架的顺序),行和列之间由 5 像素的间隙分隔。
  • 删除所有.setBounds(...)调用。 您不需要它们,因为这是布局管理器可以做得更好的地方。
  • 避免在JComboBox上使用bloodType.setLayout(null) ,因为这会使 combobox 的下拉按钮不可见。
  • 避免formFrame.setSize(500,500) 而是使用formFrame.pack() 这将导致布局管理器为您的组件提供计算出的位置和大小。 (这就是为什么您需要在.setLayout(...)调用之后执行此操作)。

然后它看起来像这样。

在此处输入图像描述

我建议在 Swing 中了解更多有关如何布局组件的信息。例如,请参阅本教程 有了那里的技能,您甚至可能想进一步改善JFrame的外观。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM