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

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/231253.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在2024年编写Android应用程序

如何在2024年编写Android应用程序 本文将介绍以下内容&#xff1a; 针对性能进行优化的单活动多屏幕应用程序 &#x1f92b;&#xff08;没有片段&#xff09;。应用程序架构和模块化 → 每个层面。Jetpack Compose 导航。Firestore。应用程序架构&#xff08;模块化特征驱动…

JS 手写 new 函数

工作中我们经常会用到 new 关键字&#xff0c;new 一个构造函数生成一个实例对象&#xff0c;那么new的过程中发生了什么呢&#xff0c;我们今天梳理下 创建一个对象对象原型继承绑定函数this返回对象 先创建一个构造函数&#xff0c;原型上添加一个方法 let Foo function (n…

Python元组与字典的基础介绍

元组(tuple) 在Python中,元组是不可变的有序元素的序列 即创建后不可以被修改 创建方式val_name ([val],[val].....) #----------声明------------ tuple_1 (1,2,3) print(tuple_1)元组的运算 虽然说元组的额元素是不可以更改的,但元组之间可以使用,,*号进行运算,运算后会…

静态网页设计——宠物狗狗网(HTML+CSS+JavaScript)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1nk4y1X74M/?vd_source5f425e0074a7f92921f53ab87712357b 使用技术&#xff1a;HTMLCSSJS&#xff08;…

can/CANFD数据记录仪——冬标神器

冬测案例 新能源电池在冬标中要测试电池的电性能&#xff0c;热管理&#xff0c;充电&#xff0c;SOC的性能电动车的关键组之一是动力电池&#xff0c;动力电池的表现&#xff0c;除了依赖自身的材料&#xff0c;工艺等硬件素质外&#xff0c;还依赖电池管理系统的表现&#xf…

小型洗衣机哪个牌子质量好?五款内衣洗衣机便宜好用的牌子推荐

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

Java设计模式-享元模式

目录 一、网站项目需求 二、传统方案 三、享元模式 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;原理类图 &#xff08;三&#xff09;内部状态和外部状态 &#xff08;四&#xff09;享元模式解决网站展现项目 &#xff08;五&#xff09;注意事项…

Linux系统安全

作为一种开放源代码的操作系统&#xff0c;linux服务器以其安全、高效和稳定的显著优势而得以广泛应用。 账号安全控制 用户账号是计算机使用者的身份凭证或标识&#xff0c;每个要访问系统资源的人&#xff0c;必须凭借其用户账号 才能进入计算机.在Linux系统中&#xff0c;提…

继电器光耦在微控制器中的应用

继电器是电子系统中的重要组件&#xff0c;用作使用低功率信号控制高功率电路的开关。继电器与微控制器的集成在各种应用中变得越来越普遍。该领域的一个重大进步是继电器光耦合器的使用&#xff0c;这是一种增强基于微控制器的系统的性能和可靠性的关键技术。 继电器光耦概述…

web3d-three.js场景设计器-TransformControls模型控制器

场景设计器-TransformControls 控制器 该控制器可以指定模型进入可控制模式-如图有三种控制方式 translate --移动模式 rotate -- 旋转模式 scale -- 缩放模式 方便布局过程中快捷对模型进行摆放操作。 引入方式 import { TransformControls } from three/examples/jsm/…

2024程序员应对挑战新方式竟然是……

2024年即将来临&#xff0c;无论2023是顺心还是不如意&#xff0c;一切都已经成为了过去式。无论在过去我们是陷入了一时的困窘&#xff0c;还是沉浸在繁花似锦的喜悦&#xff0c;我们都要保持头脑冷静&#xff0c;不被眼前迷障所困&#xff1b;我们任然要勇往直前&#xff0c;…

如何在Linux上部署1Panel面板并远程访问内网Web端管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

看CHAT如何判断php Imagick writeImages写入gif已经完毕

CHAT回复&#xff1a;Imagick::writeImages() 是同步执行的&#xff0c;也就是说这个函数会阻塞直到 GIF 文件被完全写出。所以如果这个函数没有报错并成功返回&#xff0c;那么你可以认为 GIF 文件已经被完全写出了。 如果你想要在写出 GIF 文件后立即做一些操作&#xff08;例…

使用Gitea搭建自己的git远程仓库

Gitea 为什么需要自建仓库 原因只有一个&#xff1a;折腾。其实国内的码云加上github已经足够用了。 官方原话 Gitea 的首要目标是创建一个极易安装&#xff0c;运行非常快速&#xff0c;安装和使用体验良好的自建 Git 服务。我们采用 Go 作为后端语言&#xff0c;这使我们…

跟着cherno手搓游戏引擎【3】事件系统和预编译头文件

不多说了直接上代码&#xff0c;课程中的架构讲的比较宽泛&#xff0c;而且有些方法写完之后并未测试。所以先把代码写完。理解其原理&#xff0c;未来使用时候会再此完善此博客。 文件架构&#xff1a; Event.h:核心基类 #pragma once #include"../Core.h" #inclu…

大创项目推荐 深度学习卷积神经网络的花卉识别

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

肠道炎症与年龄和阿尔茨海默病病理学相关:一项人类队列研究

谷禾健康 ​阿尔茨海默 研究表明&#xff0c;慢性低水平的炎症&#xff08;“炎症衰老”&#xff09;可能是年龄相关疾病的一个介导因素&#xff0c;而肠道微生物通过破坏肠道屏障可能会促进炎症。 虽然老化和阿尔茨海默病&#xff08;AD&#xff09;与肠道微生物群组成的改变有…

服务网格 Service Mesh

什么是服务网格&#xff1f; 服务网格是一个软件层&#xff0c;用于处理应用程序中服务之间的所有通信。该层由容器化微服务组成。随着应用程序的扩展和微服务数量的增加&#xff0c;监控服务的性能变得越来越困难。为了管理服务之间的连接&#xff0c;服务网格提供了监控、记…

python练习3【题解///考点列出///错题改正】

一、单选题 1.【单选题】 ——可迭代对象 下列哪个选项是可迭代对象&#xff08; D&#xff09;&#xff1f; A.(1,2,3,4,5) B.[2,3,4,5,6] C.{a:3,b:5} D.以上全部 知识点补充——【可迭代对象】 可迭代对象&#xff08;iterable&#xff09;是指可以通过迭代&#xff…

数字逻辑电路入门:从晶体管到逻辑门

数字逻辑电路入门&#xff1a;从晶体管到逻辑门 这是数字逻辑电路中最基础的部分。但是并非那么容易理解。 1、晶体管 mosfet&#xff1a;场效应晶体管&#xff0c;是电压控制元件。cmos&#xff1a;是指由mos管构成的门级电路通常是互补的。BJT&#xff1a;一种三极管&…