第一道经典题:编程实现登录窗体(用swing包)
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class LoginForm extends JFrame {
private JTextField usernameField;
private JPasswordField passwordField;
private JButton loginButton;
public LoginForm() {
// 设置窗体标题
setTitle("登录窗体");
// 设置默认关闭操作
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 设置窗体的布局
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(10, 10, 10, 10);
// 用户名标签和文本字段
gbc.gridx = 0;
gbc.gridy = 0;
JLabel usernameLabel = new JLabel("用户名:");
add(usernameLabel, gbc);
gbc.gridx = 1;
gbc.gridy = 0;
usernameField = new JTextField(20);
add(usernameField, gbc);
// 密码标签和密码字段
gbc.gridx = 0;
gbc.gridy = 1;
JLabel passwordLabel = new JLabel("密码:");
add(passwordLabel, gbc);
gbc.gridx = 1;
gbc.gridy = 1;
passwordField = new JPasswordField(20);
add(passwordField, gbc);
// 登录按钮
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 2;
gbc.anchor = GridBagConstraints.CENTER;
loginButton = new JButton("登录");
loginButton.addActionListener(new LoginButtonListener());
add(loginButton, gbc);
// 设置窗体大小
pack();
// 设置窗体居中显示
setLocationRelativeTo(null);
// 设置窗体可见
setVisible(true);
}
// 登录按钮的事件监听器
private class LoginButtonListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String username = usernameField.getText();
char[] password = passwordField.getPassword();
// 简单地显示输入的用户名和密码
JOptionPane.showMessageDialog(LoginForm.this,
"用户名: " + username + "\n密码: " + new String(password));
// 清除密码字段(出于安全考虑)
passwordField.setText("");
}
}
public static void main(String[] args) {
// 在事件调度线程中创建和显示GUI
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new LoginForm();
}
});
}
}
代码说明
- 导入必要的包:
javax.swing.*
:用于创建Swing组件。java.awt.*
和java.awt.event.*
:用于布局和事件处理。
- 创建主类
LoginForm
:- 继承
JFrame
类以创建主窗体。 - 使用
GridBagLayout
布局管理器来组织组件。
- 继承
- 添加组件:
- 使用
JLabel
、JTextField
和JPasswordField
添加用户名和密码输入字段。 - 使用
JButton
添加登录按钮,并为其添加ActionListener
以处理点击事件。
- 使用
- 事件处理:
- 在
LoginButtonListener
中,获取用户名和密码,并使用JOptionPane
显示它们。 - 出于安全考虑,在显示密码后立即清除密码字段。
- 在
- 主方法:
- 使用
SwingUtilities.invokeLater
确保在事件调度线程中创建和显示GUI。
- 使用
运行程序后,您将看到一个简单的登录窗体。输入用户名和密码,然后点击“登录”按钮,将显示一个对话框,其中包含您输入的信息。
第二道经典题(拔高):编写一个标准化考试小软件界面,从外部文本中读入题目,并要求第做完一个题目都把该题目的正确答案显示给用户。(用swing)
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ExamSoftware extends JFrame implements ActionListener {
private JLabel questionLabel;
private JTextField answerField;
private JButton submitButton;
private JLabel resultLabel;
private List<String> questions;
private List<String> answers;
private int currentIndex = 0;
public ExamSoftware() {
setTitle("Standardized Exam");
setSize(400, 200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
questionLabel = new JLabel();
answerField = new JTextField(20);
submitButton = new JButton("Submit");
resultLabel = new JLabel();
resultLabel.setVisible(false);
JPanel panel = new JPanel(new GridLayout(4, 1));
panel.add(questionLabel);
panel.add(answerField);
panel.add(submitButton);
panel.add(resultLabel);
add(panel, BorderLayout.CENTER);
submitButton.addActionListener(this);
loadQuestions("questions.txt");
showNextQuestion();
}
private void loadQuestions(String filePath) {
questions = new ArrayList<>();
answers = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(filePath))) {
String line;
while ((line = br.readLine()) != null) {
questions.add(line);
String answer = br.readLine();
answers.add(answer);
}
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "Error reading the file: " + e.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
System.exit(1);
}
}
private void showNextQuestion() {
if (currentIndex < questions.size()) {
questionLabel.setText(questions.get(currentIndex));
answerField.setText("");
resultLabel.setText("");
resultLabel.setVisible(false);
} else {
JOptionPane.showMessageDialog(this, "Exam Complete!");
System.exit(0);
}
}
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == submitButton) {
String userAnswer = answerField.getText().trim();
String correctAnswer = answers.get(currentIndex);
if (userAnswer.equalsIgnoreCase(correctAnswer)) {
resultLabel.setText("Correct!");
resultLabel.setForeground(Color.GREEN);
} else {
resultLabel.setText("Incorrect. The correct answer is: " + correctAnswer);
resultLabel.setForeground(Color.RED);
}
resultLabel.setVisible(true);
currentIndex++;
showNextQuestion();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new ExamSoftware().setVisible(true);
});
}
}
解释
- 类定义:
ExamSoftware
继承自JFrame
并实现了ActionListener
接口。 - 界面组件:使用
JLabel
显示题目,JTextField
输入答案,JButton
提交答案,另一个JLabel
显示结果。 - 加载题目:
loadQuestions
方法从外部文本文件questions.txt
中读取题目和答案,并存储在两个List
中。 - 显示题目:
showNextQuestion
方法根据当前索引显示题目,并在完成所有题目后显示考试完成信息。 - 事件处理:
actionPerformed
方法处理按钮点击事件,比较用户答案和正确答案,并显示结果。 - 主方法:
main
方法使用SwingUtilities.invokeLater
确保界面更新在事件调度线程中进行。
注意事项
- 确保
questions.txt
文件位于项目的根目录或提供正确的路径。 - 简化版,未处理一些可能的异常情况(如文件路径错误、文件格式错误等)。