【问题标题】:This GUI is displaying nothing after setting BoxLayout设置 BoxLayout 后,此 GUI 不显示任何内容
【发布时间】:2020-12-17 16:36:27
【问题描述】:
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并失败了。

谁能告诉我如何让它像标题一行,标签不同行,按钮不同行?

像这样:

【问题讨论】:

  • 在 makeFrame() 或 showFrame() 中?
  • 框架的默认布局管理器是BorderLayout。当您在没有约束的情况下将组件添加到框架时,组件将转到只能显示单个组件的BorderLayout.CENTER 约束,因此只有最后添加的组件可见。阅读 Layout Managers 上的 Swing 教程部分。您可以下载工作演示,然后进行更改。我建议您可以使用GridBagLayout 来实现您想要的布局。

标签: java swing user-interface layout-manager boxlayout


【解决方案1】:

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

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

这是图形用户界面。

我所做的主要更改包括:

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

  2. 我将 GUI 代码组织成三个方法,这样我就可以一次专注于 GUI 的一个部分。 JFrame 是在 run 方法中创建的。标题JPanel 是在createTitlePanel 方法中创建的。 JPanel 表单是在 createFormPanel 方法中创建的。 JFrame 的代码很少会从 Swing 应用程序更改为 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, 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 的右边缘。

这是更改后的方法。

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;
}

【讨论】:

  • 非常感谢吉尔伯特,我会通过代码询问我是否有任何不明白的地方。感谢您的帮助,因为您让我的工作更轻松。
  • 如何在此布局中进行对齐更改?喜欢 (FlowLayout.RIGHT)?
  • @Arvind Varma:哪个对齐方式改变了?标题面板布局居中。您可以更改 JPanel 的背景颜色以查看它们的大小和方向。
  • 名称、程序、ID 与我发布的上图右对齐
猜你喜欢
  • 2020-02-02
  • 1970-01-01
  • 2013-08-27
  • 1970-01-01
  • 2015-09-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-13
  • 2017-12-21
相关资源
最近更新 更多