问题描述
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并失败了。
任何人都可以告诉我如何使它像标题一样,标签不同,按钮不同吗?
赞:
解决方法
正如camickr在他的评论中所说,您通常使用GridBagLayout
创建表单。
我重新编写了您的代码,因为我希望展示一种更好的方式来编写GUI面板。
这是GUI。
我所做的主要更改包括:
-
所有Swing应用程序必须从对
SwingUtilities
invokeLater
方法的调用开始。此方法可确保在Event Dispatch Thread上创建并执行所有Swing组件。 -
我将GUI代码分为三种方法,因此我可以一次专注于GUI的一部分。
JFrame
是通过run
方法创建的。标题JPanel
是通过createTitlePanel
方法创建的。形式JPanel
是通过createFormPanel
方法创建的。JFrame
的代码很少会在Swing应用程序之间更改。 -
我使用Swing组件。除非打算覆盖其中的一种方法,否则我不会扩展Swing组件或任何Java类。
-
createFormPanel
类使用GridBagLayout
来组织列中的标签和文本字段。您可以将GridBagLayout
视为灵活的网格。网格的单元不必大小相同。 Oracle教程How to Use GridBagLayout有另一个示例。 -
我将
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;
}