设置BoxLayout后,此GUI不显示任何内容

问题描述

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class GUI_Borrower extends JFrame implements ActionListener {

    JPanel panel = new JPanel();

    JLabel lblName = new JLabel("Name:");
    JLabel lblProg = new JLabel("Program:");
    JLabel lblId = new JLabel("Library ID: ");
    JLabel lblTitle = new JLabel("Add Borrower");
    JTextField txtName = new JTextField(10);
    JTextField txtProg = new JTextField(10);
    JTextField txtId = new JTextField(10);
    static int counter = 19000;
    JButton btnSubmit = new JButton("Submit");

    public GUI_Borrower() {
        super("Add Borrower");
        makeFrame();
        showFrame();
    }

    public void makeFrame() {
        lblTitle.setFont(new Font("Forte",Font.PLAIN,40));
        lblTitle.setForeground(Color.BLUE);
        add(lblTitle);
        add(lblName);
        add(txtName);
        add(lblProg);
        add(txtProg);
        add(lblId);
        add(txtId);

        panel.setLayout(new BoxLayout(panel,BoxLayout.PAGE_AXIS));
        panel.add(btnSubmit);
        btnSubmit.addActionListener(this);
    }

    public void showFrame() {
        setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400,200);
        setLocationRelativeto(null);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent ae) {
        Object source = ae.getSource();

        if (ae.getActionCommand().equals("Confirm")) {
            txtName.setText("");
            txtProg.setText("");
            btnSubmit.setText("Submit");
        } else if (source == btnSubmit) {
            if (txtName.getText().equals("") && txtProg.getText().equals("")) {
                txtId.setText("No entry of both");
            } else if (txtName.getText().equals("")) {
                txtId.setText("No entry of Name");
            } else if (txtProg.getText().equals("")) {
                txtId.setText("No entry of Program");
            } else {
                counter++;
                txtId.setText("" + counter);

                btnSubmit.setText("Confirm");
            }
        }
    }

    public static void main(String[] args) {
        new GUI_Borrower();
    }
}

我尝试添加BoxLayout,因为所有文本字段和标签都在一行上。所以我尝试了Box Layout并失败了。

任何人都可以告诉我如何使它像标题一样,标签不同,按钮不同吗?

赞:

enter image description here

解决方法

正如camickr在他的评论中所说,您通常使用GridBagLayout创建表单。

我重新编写了您的代码,因为我希望展示一种更好的方式来编写GUI面板。

这是GUI。

Add Borrower GUI

我所做的主要更改包括:

  1. 所有Swing应用程序必须从对SwingUtilities invokeLater方法的调用开始。此方法可确保在Event Dispatch Thread上创建并执行所有Swing组件。

  2. 我将GUI代码分为三种方法,因此我可以一次专注于GUI的一部分。 JFrame是通过run方法创建的。标题JPanel是通过createTitlePanel方法创建的。形式JPanel是通过createFormPanel方法创建的。 JFrame的代码很少会在Swing应用程序之间更改。

  3. 我使用Swing组件。除非打算覆盖其中的一种方法,否则我不会扩展Swing组件或任何Java类。

  4. createFormPanel类使用GridBagLayout来组织列中的标签和文本字段。您可以将GridBagLayout视为灵活的网格。网格的单元不必大小相同。 Oracle教程How to Use GridBagLayout有另一个示例。

  5. 我将ActionListener放在一个单独的类中。在此示例中,我将其设置为内部类,因此可以将代码粘贴为一个文件。通常,应将单独的类放在单独的文件中。它使每个班级都更短,更容易理解。

这是可运行的示例代码。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;

public class BorrowerGUI implements Runnable {

    private static int ID_COUNTER = 19000;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new BorrowerGUI());
    }

    private JButton btnSubmit;

    private JTextField txtName;
    private JTextField txtProg;
    private JTextField txtId;

    @Override
    public void run() {
        JFrame frame = new JFrame("Add Borrower");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.add(createTitlePanel(),BorderLayout.BEFORE_FIRST_LINE);
        frame.add(createFormPanel(),BorderLayout.CENTER);

        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private JPanel createTitlePanel() {
        JPanel panel = new JPanel(new FlowLayout());

        JLabel lblTitle = new JLabel("Add Borrower");
        lblTitle.setFont(new Font("Forte",Font.PLAIN,40));
        lblTitle.setForeground(Color.BLUE);
        panel.add(lblTitle);

        return panel;
    }

    private JPanel createFormPanel() {
        JPanel panel = new JPanel(new GridBagLayout());
        panel.setBorder(BorderFactory.createEmptyBorder(5,5,5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5,5);
        gbc.gridx = 0;
        gbc.gridy = 0;

        JLabel lblName = new JLabel("Name:");
        panel.add(lblName,gbc);

        gbc.gridx++;
        txtName = new JTextField(20);
        panel.add(txtName,gbc);

        gbc.gridx = 0;
        gbc.gridy++;
        JLabel lblProg = new JLabel("Program:");
        panel.add(lblProg,gbc);

        gbc.gridx++;
        txtProg = new JTextField(20);
        panel.add(txtProg,gbc);

        gbc.gridx = 0;
        gbc.gridy++;
        JLabel lblId = new JLabel("Library ID:");
        panel.add(lblId,gbc);

        gbc.gridx++;
        txtId = new JTextField(20);
        txtId.setEditable(false);
        panel.add(txtId,gbc);

        gbc.gridx = 0;
        gbc.gridy++;
        gbc.gridwidth = 2;
        btnSubmit = new JButton("Submit");
        btnSubmit.addActionListener(new SubmitListener());
        panel.add(btnSubmit,gbc);

        return panel;
    }

    public class SubmitListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent ae) {
            Object source = ae.getSource();

            if (ae.getActionCommand().equals("Confirm")) {
                txtName.setText("");
                txtName.requestFocus();
                txtProg.setText("");
                txtId.setText("");
                btnSubmit.setText("Submit");
            } else if (source == btnSubmit) {
                if (txtName.getText().equals("") &&
                        txtProg.getText().equals("")) {
                    txtId.setText("No entry of both");
                } else if (txtName.getText().equals("")) {
                    txtId.setText("No entry of Name");
                } else if (txtProg.getText().equals("")) {
                    txtId.setText("No entry of Program");
                } else {
                    ID_COUNTER++;
                    txtId.setText("" + ID_COUNTER);
                    btnSubmit.setText("Confirm");
                }
            }

        }
    }
}

编辑后添加:如果标题JLabel是右对齐的,则必须切换到BorderLayout。我添加了一个空边框,因此文本不会位于JFrame的右侧。

这是更改的方法。

private JPanel createTitlePanel(String title) {
    JPanel panel = new JPanel(new BorderLayout());
    panel.setBorder(BorderFactory.createEmptyBorder(10,10,10));

    JLabel lblTitle = new JLabel(title);
    lblTitle.setFont(new Font("Forte",40));
    lblTitle.setForeground(Color.BLUE);
    panel.add(lblTitle,BorderLayout.AFTER_LINE_ENDS);

    return panel;
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...