诚之和:使用Java+Swing实现医院管理系统的实战练习 附完整实例代码

2023-10-27

本篇文章将和大家分享使用Java的Swing工具类来完成医院管理系统的实战练习,有兴趣的小伙伴们可以一起实操学习一下,本文内容有助于大家对于Java的学习和理解。

一、系统介绍

本系统实现的以下功能
管理员功能:登录系统、病人信息的增删改查、就医档案的录入、医生信息的增删改查、科室信息的增删改查、收费统计功能、修改密码。
医生功能:登录系统、病人信息的增删改查、医生信息的增删改查、科室信息的增删改查、收费统计功能、修改密码。
收费员功能:价格管理、收费管理、修改密码。
JDK版本:1.8
数据库:Mysql8.0.13

数据库用到的表
cashier
charge
department
doctor
drugtable
manager
medical_records
patient
price

工程截图

在这里插入图片描述

二、系统展示

1.登录页

在这里插入图片描述

2.主页面

在这里插入图片描述

3.病人信息录入

在这里插入图片描述

4.病人信息操作

在这里插入图片描述

5.就医档案录入

在这里插入图片描述

6.处方单录入

在这里插入图片描述

7.就医档案操作

在这里插入图片描述

8.医生信息录入

在这里插入图片描述

9.医生信息操作

在这里插入图片描述

10.科室信息录入

在这里插入图片描述

11.科室信息操作

在这里插入图片描述

12.收费操作

在这里插入图片描述

13.收费统计

在这里插入图片描述

14.修改密码

在这里插入图片描述

15.医生主页面

在这里插入图片描述

16.收费员主页面

在这里插入图片描述

三、系统实现

Login.java

package com.sjsq;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class Login extends JFrame {

	public static String namew;
	// 输入的用户Id
	public static String userId;
	// 输入的用户名
	public static String username;
	// 输入的密码
	public static String password;
	// 验证标识
	int loginFlag = 0;
	private static final long serialVersionUID = 1L;
	DBUtil dbUtil = new DBUtil();
	Connection con = dbUtil.getConnection();
	
	// 账号
	JLabel accountJLabel = new JLabel("账号:");
	// 错误提示标签
	JLabel errorJLabel = new JLabel("用户名或者密码不对,请重新输入");
	// 密码
	JLabel passwordJLabel = new JLabel("密码:");

	// r1:管理员 r2:收费员 r3:医生
	public JRadioButton r1, r2, r3;
	ImageIcon bg = new ImageIcon("picture/login_bg.jpg");
	JLabel bgJLabel = new JLabel(bg);

	JButton loginJButton = new JButton("登录");
	JButton cancelJButton = new JButton("取消");

	private boolean flag;
	static JTextField usernameJTextField = new JTextField();
	static JPasswordField passwordJPasswordField = new JPasswordField();

	Login(String sTitle) {
		super(sTitle);
		this.setLayout(null);
		this.add(errorJLabel); // 添加控件

		this.add(accountJLabel);
		this.add(passwordJLabel);
		this.add(loginJButton);
		this.add(cancelJButton);

		this.add(usernameJTextField);
		this.add(passwordJPasswordField);

		final JRadioButton r1 = new JRadioButton("管理员");
		final JRadioButton r2 = new JRadioButton("收费员");
		final JRadioButton r3 = new JRadioButton("医生");
		
		ButtonGroup rg = new ButtonGroup();
		this.add(r2);
		rg.add(r1);
		this.add(r3);
		rg.add(r3);
		this.add(r1);
		rg.add(r2);
		r1.setBounds(150, 180, 80, 30);
		r2.setBounds(230, 180, 80, 30);
		r3.setBounds(310, 180, 80, 30);
		r1.setFocusPainted(false);
		r2.setFocusPainted(false);
		r3.setFocusPainted(false);
		r3.setContentAreaFilled(false);
		r1.setContentAreaFilled(false);
		r2.setContentAreaFilled(false);

		errorJLabel.setBounds(100, 130, 200, 50);
		errorJLabel.setForeground(Color.black);
		errorJLabel.setVisible(false);

		bgJLabel.setBounds(0, 0, 592, 350);
		
		// 登录监听
		loginJButton.addActionListener(new ActionListener() {
			public boolean flag = false;

			public void actionPerformed(ActionEvent e) {

				// 医生
				if (r3.isSelected()) {
					try {
						String usernameText = usernameJTextField.getText().toString(); // 获取帐号文本框内容
						String passwordText = passwordJPasswordField.getText().toString(); // 获取密码文本框内容
						Statement stmt = con.createStatement();
						ResultSet rs = stmt.executeQuery("select * from doctor"); // 执行SQL语句,返回结果集
						while (rs.next()) {

							userId = rs.getString("DrId"); // 获取登录的用户编号,
							username = rs.getString("DrName");// 获取登录的用户姓名
							password = rs.getString("Password"); // 获取数据库中的数据项的密码
							if (userId.equals(usernameText) && password.equals(passwordText)) {// 判断数据库的用户编号以及密码是否与文本框的值相同
								loginFlag = 1;
								break;
							}

						}
						if (loginFlag == 1) {
							JOptionPane.showMessageDialog(null, "登录成功");
							// 显示系统主界面
							MainPanelDoctor a = new MainPanelDoctor("医生界面"); 
							a.setVisible(true);
							Login.this.setVisible(false);// 关闭登录按钮
						} else {
							usernameJTextField.setText(""); // 错误的话则文本框内容设置为空,显示错误标签
							passwordJPasswordField.setText("");

							JOptionPane.showMessageDialog(null, "登陆错误");
						}
					} catch (SQLException e2) {
						System.out.println(e2);
					}
				}
				
				// 管理员
				else if (r1.isSelected()) {

					try {
						
						String usernameText = usernameJTextField.getText().toString(); // 获取帐号文本框内容
						String passwordText = passwordJPasswordField.getText().toString(); // 获取密码文本框内容

						Statement stmt = con.createStatement();
						ResultSet rs = stmt.executeQuery("select * from manager"); // 执行SQL语句,返回结果集
						while (rs.next()) {

							userId = rs.getString("ManagerID"); // 获取登录的用户编号,
							username = rs.getString("ManagerName");// 获取登录的用户姓名
							password = rs.getString("MaPassWord"); // 获取数据库中的数据项的密码
							if (userId.equals(usernameText) && password.equals(passwordText)) {// 判断数据库的用户编号以及密码是否与文本框的值相同

								loginFlag = 1;

								break;
							}

						}
						// 登录成功
						if (loginFlag == 1) {
							JOptionPane.showMessageDialog(null, "登录成功");
							new MainPanelManager("管理员界面"); // 显示系统主界面
							Login.this.setVisible(false);// 关闭登录按钮
						// 登录失败
						} else {
							usernameJTextField.setText(""); // 错误的话则文本框内容设置为空,显示错误标签
							passwordJPasswordField.setText("");
							JOptionPane.showMessageDialog(null, "登陆错误");
						}
					} catch (SQLException e3) {
						System.out.println(e3);
					}

				}
				// 收费员
				else if (r2.isSelected()) {

					try {
						String usernameText = usernameJTextField.getText().toString(); // 获取帐号文本框内容
						String passwordText = passwordJPasswordField.getText().toString(); // 获取密码文本框内容
						
						Statement stmt = con.createStatement();
						ResultSet rs = stmt.executeQuery("select * from cashier"); // 执行SQL语句,返回结果集
						while (rs.next()) {

							userId = rs.getString("cashierId"); // 获取登录的用户编号,
							username = rs.getString("cashierName");// 获取登录的用户姓名
							password = rs.getString("cashierPassWord"); // 获取数据库中的数据项的密码
							if (userId.equals(usernameText) && password.equals(passwordText)) {// 判断数据库的用户编号以及密码是否与文本框的值相同

								loginFlag = 1;

								break;
							}

						}
						if (loginFlag == 1) {
							JOptionPane.showMessageDialog(null, "登录成功");
							new MainPanelCashier("收费员页面"); // 显示系统主界面
							Login.this.setVisible(false);// 关闭登录按钮
						} else {
							usernameJTextField.setText(""); // 错误的话则文本框内容设置为空,显示错误标签
							passwordJPasswordField.setText("");

							JOptionPane.showMessageDialog(null, "登陆错误");
						}
					} catch (SQLException e3) {
						System.out.println(e3);
					}

				} else if (r1.isSelected() == false && r2.isSelected() == false && r3.isSelected() == false) {
					JOptionPane.showMessageDialog(null, "请选择用户类型");

				}

			}
		});

		// 登录按钮添加功能事件

		// 账号
		accountJLabel.setBounds(150, 50, 100, 50);
		accountJLabel.setFont(new Font("", 1, 20));

		// 密码
		passwordJLabel.setBounds(150, 120, 100, 50);
		passwordJLabel.setFont(new Font("", 1, 20));

		// 登录
		loginJButton.setBounds(150, 220, 100, 40);
		loginJButton.setBackground(Color.CYAN);
		
		// 取消
		cancelJButton.setBounds(280, 220, 100, 40);
		cancelJButton.setBackground(Color.CYAN);
		
		// 账号输入框
		usernameJTextField.setBounds(250, 60, 150, 30);
		// 密码输入框
		passwordJPasswordField.setBounds(250, 120, 150, 30);

		this.add(bgJLabel);
		this.setVisible(true);
		this.setSize(600, 350); // 设置窗口大小
		this.setResizable(false); // 设置不可调整窗口大小
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}

	public static void main(String args[]) {
		Login login = new Login("医院管理系统");
	}

}

HomePage.java

HomePage.java
package com.sjsq;
import java.awt.Font;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class HomePage extends JFrame {
	JPanel homePage = new JPanel();
	private JLabel la1, la2;
	private Font laFont = new Font("隶书", Font.BOLD, 100);

	public HomePage() {
		homePage.setLayout(null);
		// 获取项目路径
		ImageIcon background = new ImageIcon("picture/right_bg.jpg");
		JLabel label = new JLabel(background);

		la1 = new JLabel("欢迎使用");
		la2 = new JLabel("医院信息管理系统");

		la1.setBounds(330, 0, 800, 300);
		la1.setFont(laFont);
		la2.setBounds(120, 150, 1000, 300);
		la2.setFont(laFont);

		homePage.add(la1);
		homePage.add(la2);

		homePage.add(label);
		label.setBounds(0, 0, 1100, 700);
	}
}

Charge.java

package com.sjsq;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.table.DefaultTableModel;

public class Charge extends JFrame implements ActionListener {
	private JComboBox box1;
	private JScrollPane JScrollPane5 = new JScrollPane();
	JPanel pan
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

诚之和:使用Java+Swing实现医院管理系统的实战练习 附完整实例代码 的相关文章

  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 如何配置eclipse以保持这种代码格式?

    以下代码来自 playframework 2 0 的示例 Display the dashboard public static Result index return ok dashboard render Project findInv
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • 如何用U盘启动做系统启动盘,如何重装系统

    一般重装系统大多会使用镜像刻录工具 把iso镜像刻录到U盘 今天我们使用官方的工具来刻录U盘 首先我们要格式化U盘 然后进入windows下载官网 这里以win11为例 Win11 https www microsoft com zh cn
  • C++ 拷贝构造函数中的Private权限问题

    引言 在C 中 拷贝构造函数是用于创建一个对象的副本的特殊成员函数 拷贝构造函数通常被定义为公有成员函数 以便其他对象能够使用它来创建副本 然而 有些人可能会对拷贝构造函数能否访问私有成员变量产生疑问 本文将详细探讨C 拷贝构造函数中的Pr
  • 分享串口接收中断只能接收到一个字节的其中一个原因

    问题 今天来分享一个我这两天遇到的一个很狗血的问题 就是我在写一个新项目串口部分时候 发现串口怎么只能接收到一个字节 因为我用的是接收中断RBEN吗 每接收到一个字节都会中断一次 可是这次我发现我每次怎么只能收到一个字节 然后我调试了一遍发
  • 宇宙第一 IDE Visual Studio 要放弃 Mac 了

    当地时间 8 月 30 日 微软在其官网发文称 已经关停 Visual Studio for Mac 的开发 相关支持将于 2024 年 8 月 31 日结束 微软将继续支持最新版本的 Mac IDE 集成开发环境 根据相关通知 使用 NE
  • 遗传算法的matlab实现

    遗传算法 Genetic Algorithm GA 是20世纪70年代初兴起的一门新兴学科 遗传算法的基本思想来源于达尔文的进化论和孟德尔的遗传学说 它通过模拟生物进化的过程来求解问题 生物中的基因对应优化问题中的变量组合 一个解则代表了一
  • 数据结构与算法 学习摘要

    时间复杂度比较 O 1 lt O logn lt O n lt O nlogn lt O n 2 lt O n 3 线性表 栈 stack 后进先出 队列 queue 先进先出 链表 linkedlist 单链表 双链表 https git
  • Linux8 如何重启网络服务

    本文主要讲解如何重启RHEL 8或者CentOS 8网络以及如何解决RHEL8和CentOS8系统的网络管理服务报错 当我们安装好RHEL 8或者 CentOS 8 重启启动网络时 会出现以下报错 systemctl restart net
  • 板子接线图

    1 ST LINK V2接线 2 对抗板子刷蓝牙固件 接USB转TTL 用镊子短接两个孔 2 对抗板子用串口测试蓝牙AT命令 短接白色箭头 接TX RX 电源
  • 嵌入式开发面试中经常被问到的问题记录

    问题 你能介绍一下你最熟悉的处理器架构及其特点吗 在嵌入式开发中 你通常使用哪些编程语言 对于不同的应用场景 如何选择适合的编程语言 请描述一下您在项目中遇到的最具挑战性的问题 并解释您是如何解决这个问题的 如何设计和实现一个多线程嵌入式系
  • JavaScript:从入门到精通总结二

    7 代码块 1 代码块只有分组的功能 代码块内部的内容 外部完全可见 2 prompt 弹出提示框 并且该提示框会带有一个文本框 返回值是string类型 3 switch语句中条件表达式是进行全等比较 4 可以为循环语句创建一个label
  • spring-data-JPA repository自定义方法规则

    Spring Data JPA框架在进行方法名解析时 会先把方法名多余的前缀截取掉 比如find findBy read readBy get getBy 然后对剩下的部分进行解析 假如创建如下的查询 findByUserDepUuid 框
  • Linux系统管理(五)企业存储的基本管理

    目录 一 设备识别 二 设备挂载 三 设备中文件的查找 四 分区 五 swap分区 六 磁盘配额 一 设备识别 添加硬盘 设备接入系统后都是以文件的形式存在 设备文件名称 串口硬盘 SATA SAS USB dev sda dev sdb
  • 文件共享 无法访问,你可能没有权限使用网络资源,请与这台服务器的管理员联...

    文件或文件夹设置成共享之后 通过 运行 如运行 gt 192 168 0 123 进行访问 报错 192 168 0 123无法访问 你可能没有权限使用网络资源 请与这台服务器的管理员联系 这问题碰到好几回了 每次都是同事帮忙解决的 这次又
  • 什么是xxl-job?

    xxl job是一款开源的分布式任务调度框架 主要用于解决大规模分布式任务的调度和执行问题 它提供了任务调度中心 执行器和任务日志等组件 可以实现任务的定时调度 动态添加和删除任务 任务执行情况的监控和日志记录等功能 xxl job的作用主
  • HTML <ul> 标签

    实例 无序 HTML 列表 ul li Coffee li li Tea li li Milk li ul ul 标签定义无序列表 浏览器支持 元素 Chrome IE Firefox Safari Opera ul Yes Yes Yes
  • cad汉仪长仿宋体_长仿宋体字体下载 cad工程机械绘图工程制图国标字体下载

    做CAD很多时候要用到国标字体 CAD制图上用的国标字体一般就是长仿宋体 特此小编给大家分享 ttf格式的cad工程机械绘图工程制图国标字体下载 长仿宋体字体一般是专门用来做cad工程机械绘制效果图中使用 希望大家喜欢 界面预览图 在很多专
  • zlib库自定义接口封装

    zlib库自定义接口封装 zlib封装类说明 编译zlib库 编译自定义接口静态库 测试代码 代码 文件链接 zlib封装类说明 实现对文件以及文件夹的压缩解压缩 zip unzip h ifndef ZIP UNZIP H define
  • 《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi

    题目描述 编程实现字符串到整数的转换 例如输入字符串 123456 输出整数12345 函数atoi atoi 是把字符串转换成整型数的一个函数 包含在头文件stdlib h中 函数原型 int atoi const char nptr 参
  • 电机控制里的谐波和逆变器非线性探讨

    电机控制里的谐波或逆变器非线性探讨 一 逆变器非线性第一个主要原因是死区时间及器件延迟时间 二 逆变器非线性第二原因是功率管的压降 三 逆变器的非线性会引起零电流箝位现象 导致电流波形不够正旋 增大了谐波干扰 并且在一个周期中会有6次电流畸
  • 诚之和:使用Java+Swing实现医院管理系统的实战练习 附完整实例代码

    本篇文章将和大家分享使用Java的Swing工具类来完成医院管理系统的实战练习 有兴趣的小伙伴们可以一起实操学习一下 本文内容有助于大家对于Java的学习和理解 一 系统介绍 本系统实现的以下功能 管理员功能 登录系统 病人信息的增删改查