一、目的
通过用户图形界面设计,掌握JavaSwing开发的基本方法。
二、实验内容与设计思想
实验内容:
课本验证实验:
Example10_6
图 1
Example10_7
图 2
图 3
Example10_15
图 4
设计思想:
①学生信息管理系统:
※结果截图:
图 5?窗口效果图
图 6?写入学生信息
图 7?写入学生信息成功
图 8?输入查询学生的ID
图 9?查询成功
图 10?存储学生信息的文件
图 11?加载学生信息成功
图 12?输入查询加载后学生的ID
图 13??查询成功
图 14?输入不存在的学生ID(异常处理)
※设计思路:
1、该应用程序通过一个图形用户界面(GUI)允许用户输入和查看学生信息。
2、用户可以通过"Save"按钮保存输入的学生信息,"Load"按钮加载已保存的学生信息,"Query"按钮3、查询特定学生信息。
4、学生信息包括ID,姓名,年龄,专业,以及性别。
5、为了实现对学生信息的存储和查询,程序使用了Java中的HashMap数据结构。
※主要代码结构:
1、在StudentInfoGUI构造函数中,初始化组件并添加事件监听器。
2、定义三个按钮:“Save”,“Load”和“Query”,并为每个按钮添加一个动作监听器。
3、定义一个JPanel并添加组件以显示学生信息。
4、定义三个私有方法:saveStudentInfo(),?loadStudentInfo()?和?queryStudentInfo()。这些方法处理按钮的点击事件。
5、在主窗口中显示所有组件。
※主要代码段的文字分析:
1、JTextField idField, nameField, ageField, majorField;:这些是用于输入学生信息的文本框。
2、JCheckBox maleCheckBox, femaleCheckBox;:这些是用于选择学生性别的复选框。
3、JTextArea outputArea;:这是一个文本区域,用于显示输出信息。
4、Map<String, Student> students;:这是一个HashMap,用于存储学生信息。键是一个字符串(学生的ID),值是一个Student对象。
5、saveButton.addActionListener(new ActionListener() {...});:为"Save"按钮添加一个动作监听器,当点击该按钮时,调用saveStudentInfo()方法。
6、loadButton.addActionListener(new ActionListener() {...});:为"Load"按钮添加一个动作监听器,当点击该按钮时,调用loadStudentInfo()方法。
7、queryButton.addActionListener(new ActionListener() {...});:为"Query"按钮添加一个动作监听器,当点击该按钮时,调用queryStudentInfo()方法。
8、JPanel panel = new JPanel(new GridLayout(7, 2));:创建一个新的JPanel并设置其布局为7行2列的网格布局。
9、panel.add(new JLabel("ID:")); panel.add(idField);:向面板添加标签和文本框以输入学生ID。
10、panel.add(new JLabel("Name:")); panel.add(nameField);:向面板添加标签和文本框以输入学生姓名。
11、panel.add(new JLabel("Age:")); panel.add(ageField);:向面板添加标签和文本框以输入学生年龄。
12、panel.add(new JLabel("Major:")); panel.add(majorField);:向面板添加标签和文本框以输入学生专业。
三、实验使用环境
Eclipse集成开发环境
四、实验小结
一、实验中遇到的问题及解决过程
在本次实验中,我遇到了以下几个问题:
2.代码逻辑错误:在编写代码的过程中,我发现自己的代码逻辑有错误,导致程序无法正常运行。经过仔细排查和调试,最终找到了问题所在并进行了修复。
3.技术难点:在实验过程中,我遇到了一些技术难点,比如如何使用Java中的多线程等。通过查阅相关资料和请教同学,我逐渐掌握了这些技术难点。
二、实验中产生的错误及原因分析
在实验中,我主要出现了以下几个错误:
1.语法错误:在编写代码的过程中,由于疏忽大意,导致出现了语法错误。这些错误在编译阶段就被发现并及时修复。
2.逻辑错误:由于代码逻辑复杂,我在编写代码的过程中出现了逻辑错误。这些错误在测试阶段被发现,并通过调试进行了修复。
3.运行错误:由于环境配置问题或者代码本身的问题,导致程序在运行时出现了错误。这些错误通过仔细排查和调试得到了解决。
三、实验体会和收获
通过本次实验,我获得了以下体会和收获:
1.仔细审题:在实验开始前,一定要仔细审题,明确实验任务的目标和要求。这样可以避免在实验过程中走弯路。
2.多交流:在实验过程中,要多与同学和老师交流,共同解决问题。这样可以拓宽自己的思路,学到更多的知识。
3.善于总结:在实验结束后,要善于总结自己的实验结果和经验教训。这样可以加深对知识的理解和记忆,为以后的实验打下良好的基础。
四、结论
通过本次Java程序设计实验,我深入了解了Java语言的基本特性和编程方法,掌握了多线程等复杂技术的使用方法。虽然在实验过程中遇到了一些问题和挫折,但通过不断地学习和探索,我最终成功地完成了实验任务。这次实验让我更加深刻地认识到编程的复杂性和挑战性,同时也让我更加坚定了自己学习编程的决心和信心。我相信在未来的学习和工作中,我会更加努力地学习和掌握更多的编程知识和技能。
五、参考文献
[1]耿祥义,张跃平,Java面向对象程序设计(第3版)?,清华大学出版社,2020
六、源代码附件
第一题:
package test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.util.HashMap;
import java.util.Map;
public class StudentInfoGUI extends JFrame {
????private JTextField idField, nameField, ageField, majorField;
????private JCheckBox maleCheckBox, femaleCheckBox;
????private JTextArea outputArea;
????private Map<String, Student> students;
????public StudentInfoGUI() {
????????students = new HashMap<>();
????????idField = new JTextField(10);
????????nameField = new JTextField(10);
????????ageField = new JTextField(10);
????????majorField = new JTextField(10);
????????maleCheckBox = new JCheckBox("Male");
????????femaleCheckBox = new JCheckBox("Female");
????????outputArea = new JTextArea(10, 30);
????????outputArea.setEditable(false);
????????JButton saveButton = new JButton("Save");
????????JButton loadButton = new JButton("Load");
????????JButton queryButton = new JButton("Query");
????????saveButton.addActionListener(new ActionListener() {
????????????@Override
????????????public void actionPerformed(ActionEvent e) {
????????????????saveStudentInfo();
????????????}
????????});
????????loadButton.addActionListener(new ActionListener() {
????????????@Override
????????????public void actionPerformed(ActionEvent e) {
????????????????loadStudentInfo();
????????????}
????????});
????????queryButton.addActionListener(new ActionListener() {
????????????@Override
????????????public void actionPerformed(ActionEvent e) {
????????????????queryStudentInfo();
????????????}
????????});
????????JPanel panel = new JPanel(new GridLayout(7, 2));
????????panel.add(new JLabel("ID:"));
????????panel.add(idField);
????????panel.add(new JLabel("Name:"));
????????panel.add(nameField);
????????panel.add(new JLabel("Age:"));
????????panel.add(ageField);
????????panel.add(new JLabel("Major:"));
????????panel.add(majorField);
????????panel.add(new JLabel("Gender:"));
????????panel.add(maleCheckBox);
????????panel.add(new JLabel(""));
????????panel.add(femaleCheckBox);
????????JPanel buttonPanel = new JPanel();
????????buttonPanel.add(saveButton);
????????buttonPanel.add(loadButton);
????????buttonPanel.add(queryButton);
????????Container container = getContentPane();
????????container.setLayout(new BorderLayout());
????????container.add(panel, BorderLayout.CENTER);
????????container.add(buttonPanel, BorderLayout.SOUTH);
????????container.add(new JScrollPane(outputArea), BorderLayout.EAST);
????????setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
????????setSize(500, 300);
????????setVisible(true);
????}
????private void saveStudentInfo() {
????????String id = idField.getText();
????????String name = nameField.getText();
????????int age = Integer.parseInt(ageField.getText());
????????String major = majorField.getText();
????????String gender = maleCheckBox.isSelected() ? "Male" : "Female";
????????Student student = new Student(id, name, age, major, gender);
????????students.put(id, student);
????????try (ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("students.dat"))) {
????????????outputStream.writeObject(students);
????????????JOptionPane.showMessageDialog(this, "Student information saved successfully!");
????????} catch (IOException ex) {
????????????JOptionPane.showMessageDialog(this, "Error saving student information: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
????????}
????}
???private void loadStudentInfo() {
????????try (ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("students.dat"))) {
????????????students = (Map<String, Student>) inputStream.readObject();
????????????JOptionPane.showMessageDialog(this, "Student information loaded successfully!");
????????} catch (IOException | ClassNotFoundException ex) {
????????????JOptionPane.showMessageDialog(this, "Error loading student information: " + ex.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
????????}
????}
????private void queryStudentInfo() {
????????String id = JOptionPane.showInputDialog(this, "Enter student ID:");
????????if (students.containsKey(id)) {
????????????Student student = students.get(id);
????????????outputArea.setText(student.toString());
????????} else {
????????????outputArea.setText("Student not found.");
????????}
????}
????public static void main(String[] args) {
????????SwingUtilities.invokeLater(new Runnable() {
????????????@Override
????????????public void run() {
???????????? StudentInfoGUI win = new StudentInfoGUI();
????????????????win.setTitle("学生信息管理系统");
????????????}
????????});
????}
}
class Student implements Serializable {
????private static final long serialVersionUID = 1L;
????private String id;
????private String name;
????private int age;
????private String major;
????private String gender;
????public Student(String id, String name, int age, String major, String gender) {
????????this.id = id;
????????this.name = name;
????????this.age = age;
????????this.major = major;
????????this.gender = gender;
????}
????@Override
????public String toString() {
????????return "ID: " + id + "\nName: " + name + "\nAge: " + age + "\nMajor: " + major + "\nGender: " + gender;
????}
}