Java程序设计——GUI设计

一、目的

通过用户图形界面设计,掌握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集成开发环境

四、实验小

一、实验中遇到的问题及解决过程

在本次实验中,我遇到了以下几个问题:

  1. 对题目理解不准确:在实验初期,由于没有仔细审题,导致我对实验任务的要求理解不准确。后来通过与同学和老师交流,我逐渐明确了实验任务的目标和要求。

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

相关推荐
腾讯TNTWeb前端团队6 小时前
helux v5 发布了,像pinia一样优雅地管理你的react状态吧
前端·javascript·react.js
mghio7 小时前
Dubbo 中的集群容错
java·微服务·dubbo
范文杰9 小时前
AI 时代如何更高效开发前端组件?21st.dev 给了一种答案
前端·ai编程
拉不动的猪9 小时前
刷刷题50(常见的js数据通信与渲染问题)
前端·javascript·面试
拉不动的猪10 小时前
JS多线程Webworks中的几种实战场景演示
前端·javascript·面试
FreeCultureBoy10 小时前
macOS 命令行 原生挂载 webdav 方法
前端
uhakadotcom11 小时前
Astro 框架:快速构建内容驱动型网站的利器
前端·javascript·面试
uhakadotcom11 小时前
了解Nest.js和Next.js:如何选择合适的框架
前端·javascript·面试
uhakadotcom11 小时前
React与Next.js:基础知识及应用场景
前端·面试·github