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

相关推荐
戌崂石几秒前
最优化方法Python计算:有约束优化应用——线性可分问题支持向量机
python·机器学习·支持向量机·最优化方法
跑调却靠谱17 分钟前
elementUI调整滚动条高度后与固定列冲突问题解决
前端·vue.js·elementui
小小寂寞的城17 分钟前
Jenkins里构建一个简单流水线
java·运维·jenkins
呵呵哒( ̄▽ ̄)"35 分钟前
React - 编写选择礼物组件
前端·javascript·react.js
wowocpp35 分钟前
idea springboot 配置文件 中文显示
java·spring boot·intellij-idea
User_芊芊君子38 分钟前
【Java面试题】——this 和 super 的区别
java·开发语言
柴薪之王、睥睨众生39 分钟前
(自用)Java学习-5.8(总结,springboot)
java·开发语言·spring boot·学习·mybatis
牛马baby39 分钟前
Java高频面试之并发编程-17
java·开发语言·面试
Coding的叶子39 分钟前
React Flow 简介:构建交互式流程图的最佳工具
前端·react.js·流程图·fgai·react agent
不辉放弃2 小时前
java连数据库
java·mysql