设置BoxLayout后,此GUI不显示任何内容 [英] This GUI is displaying nothing after setting BoxLayout
问题描述
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:
-
所有Swing应用程序必须从对
SwingUtilities
invokeLater
方法的调用开始.此方法确保在事件调度线程上创建并执行所有Swing组件..
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屋!