设置BoxLayout后,此GUI不显示任何内容 [英] This GUI is displaying nothing after setting BoxLayout

查看:74
本文介绍了设置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并失败了.

I tried adding BoxLayout because all the text fields and labels are on one line. So I tried box Layout and failed.

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

Can anyone show me how to make it like the title one line, label Different line, button different line?

赞:

推荐答案

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

As camickr says in his comment, you generally use a GridBagLayout to create a form.

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

I reworked your code because I hope to show a better way to code a GUI panel.

这是GUI.

我所做的主要更改包括:

The major changes I made include:

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

  1. All Swing applications must start with a call to the SwingUtilities invokeLater method. This method ensures that all Swing components are created and executed on the Event Dispatch Thread.

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

I organized the GUI code into three methods so I could focus on one part of the GUI at a time. The JFrame is created in the run method. The title JPanel is created in the createTitlePanel method. The form JPanel is created in the createFormPanel method. The code for the JFrame will rarely change from Swing application to Swing application.

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

I use Swing components. I don't extend Swing components, or any Java class, unless I intend to override one of the class methods.

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

The createFormPanel class uses the GridBagLayout to organize the labels and text fields in columns. You can think of the GridBagLayout as a flexible grid. The cells of the grid don't have to be the same size. The Oracle tutorial, How to Use GridBagLayout, has another example.

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

I put the ActionListener in a separate class. I made it an inner class in this example so I could paste the code as one file. Generally, you should put separate classes in separate files. It makes each class shorter and easier to understand.

这是可运行的示例代码.

Here's the runnable, example code.

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, 5));

        GridBagConstraints gbc = new GridBagConstraints();
        gbc.anchor = GridBagConstraints.LINE_START;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.insets = new Insets(5, 5, 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 的右侧.

Edited to add: If you want the title JLabel to be right-justified, you'll have to switch to a BorderLayout. I added an empty border so the text wouldn't be on the right edge of the JFrame.

这是已更改的方法.

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

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

    return panel;
}

这篇关于设置BoxLayout后,此GUI不显示任何内容的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆