项目——学生信息管理系统3

news2024/11/25 10:04:50

目录

班级添加的界面实现

创建班级的实体类

在org.xingyun.dao 包下 编写 ClassDao

创建 AddStudentClassFrm 添加班级页面

注意创建成 JInternalFrame 类型

给控件起个名字

注释掉main方法

给提交按钮绑定事件

回到 MainFrm.java 给添加班级按钮绑定事件

启动测试

班级列表页面的制作

创建 ManageClassFrm 注意创建成 JInternalFrame

布局设置成绝对定位

添加滚动容器

滚动容器中,添加 表格

设置表头

给各个组件起个名字

回到 MainFrm.java 给班级列表按钮绑定事件

在 ClassDao 里面提供查询的方法

当 ManageClassFrm 页面打开后,查询班级信息展示到表格中

在 ManageClassFrm 提供一个方法,展示班级数据

在 ManageClassFrm 的构造方法中调用 setTable()方法执行

测试

给查询按钮绑定事件

继续制作 ManageClassFrm 页面 加上删除 修改功能

给表格中的每一行数据绑定事件

测试

给确认删除按钮,添加事件

编写ClassDao 提供删除操作

编写代码进行删除

给确认修改按钮添加点击事件

编写ClassDao提供修改的方法


班级添加的界面实现

创建班级的实体类

public class StudentClass {
    private int id;
    private String name;
    private String info;
    //get set 方法自己补上
}   

在org.xingyun.dao 包下 编写 ClassDao

public class ClassDao {
    // 添加班级
    public boolean addClass(StudentClass scl) {
        try {
            Connection con = JDBCUtils.getConnection();
            String sql = "insert into s_class values(null,?,?)";
            java.sql.PreparedStatement preparedStatement = con.prepareStatement(sql);
            preparedStatement.setString(1, scl.getName());
            preparedStatement.setString(2, scl.getInfo());
            if (preparedStatement.executeUpdate() > 0) {
                return true;
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return false;
    }
}
​

创建 AddStudentClassFrm 添加班级页面

注意创建成 JInternalFrame 类型

页面制作,自己拖一下

给控件起个名字

classNameTextField 班级名称

classInfoTextArea 班级信息 addClassBtnNewButton 按钮

注释掉main方法

给提交按钮绑定事件

//添加班级按钮的事件绑定
        addClassBtnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //抽取个方法
                addClass(e);
            }
        });
// 添加班级
    protected void addClass(ActionEvent e) {
        // TODO Auto-generated method stub
        // TODO Auto-generated method stub
        String className = classNameTextField.getText().toString();
        String classInfo = classInfoTextArea.getText().toString();
        if (StringUtil.isEmpty(className)) {
            JOptionPane.showMessageDialog(this, "班级名称不能为空!");
            return;
        }
        StudentClass scl = new StudentClass();
        scl.setName(className);
        scl.setInfo(classInfo);
        ClassDao classDao = new ClassDao();
        if (classDao.addClass(scl)) {
            JOptionPane.showMessageDialog(this, "班级添加成功!");
        } else {
            JOptionPane.showMessageDialog(this, "班级添加失败!");
        }
        
        // 添加完后,清空表单
        classNameTextField.setText("");
        classInfoTextArea.setText("");
​
    }

回到 MainFrm.java 给添加班级按钮绑定事件

//添加班级
        menuItem_4.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                openAddClassFrm(e);
            }
        });
    //打开添加班级页面
    protected void openAddClassFrm(ActionEvent e) {
        // TODO Auto-generated method stub
        AddStudentClassFrm addStudentClassFrm = new AddStudentClassFrm();
        addStudentClassFrm.setVisible(true);
        desktopPane.add(addStudentClassFrm);
    }

启动测试

班级列表页面的制作

创建 ManageClassFrm 注意创建成 JInternalFrame

注释掉main方法

布局设置成绝对定位

添加滚动容器

滚动容器中,添加 表格

设置表头

给各个组件起个名字

classListTable;

selectBtnNewButton

classNametextField;

回到 MainFrm.java 给班级列表按钮绑定事件

//班级列表绑定事件
        menuItem_5.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //抽个方法
                openManageClassFrm(e);
            }
        });
// 打开班级列表页面
    protected void openManageClassFrm(ActionEvent e) {
        // TODO Auto-generated method stub
        ManageClassFrm manageClassFrm = new ManageClassFrm();
        manageClassFrm.setVisible(true);
        desktopPane.add(manageClassFrm);
    }
​

在 ClassDao 里面提供查询的方法

public List<StudentClass> getClassList(StudentClass studentClass) {

		List<StudentClass> retList = new ArrayList<StudentClass>();
		String sqlString = "select * from s_class";
		if (!StringUtil.isEmpty(studentClass.getName())) {
			sqlString += " where name like '%" + studentClass.getName() + "%'";
		}
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sqlString);
			ResultSet executeQuery = preparedStatement.executeQuery();
			while (executeQuery.next()) {
				StudentClass sc = new StudentClass();
				sc.setId(executeQuery.getInt("id"));
				sc.setName(executeQuery.getString("name"));
				sc.setInfo(executeQuery.getString("info"));
				retList.add(sc);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return retList;
	}

当 ManageClassFrm 页面打开后,查询班级信息展示到表格中

在 ManageClassFrm 提供一个方法,展示班级数据

//给表格填充数据
	private void setTable(StudentClass studentClass){
		//获取表格控件模型
		DefaultTableModel dft = (DefaultTableModel) classListTable.getModel();
		dft.setRowCount(0); //清空表格数据
		ClassDao classDao = new ClassDao();
		List<StudentClass> classList = classDao.getClassList(studentClass);
		//遍历集合
		for (StudentClass sc : classList) {
			Vector v = new Vector();
			v.add(sc.getId());
			v.add(sc.getName());
			v.add(sc.getInfo());
			//把数据添加 表格中
			dft.addRow(v);
		}
		
	}

在 ManageClassFrm 的构造方法中调用 setTable()方法执行

测试

给查询按钮绑定事件

//查询按钮绑定事件
		selectBtnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//获取输入框输入的内容
				String className = classNametextField.getText().toString().trim();
				StudentClass studentClass = new StudentClass();
				studentClass.setName(className);
				//调用方法
				setTable(studentClass);
			}
		});

继续制作 ManageClassFrm 页面 加上删除 修改功能

给组件起个名字

editClassNameTextField

okEditButton

okDeleteBtnNewButton

editClassInfoTextArea

给表格中的每一行数据绑定事件

// 给表格中每一行绑定鼠标点击事件
		classListTable.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				// 弹框个框测试下
				//JOptionPane.showMessageDialog(null, "点击了");
				
				selectedTableRow(e);

			}
		});
//选中的哪一行,把数据展示到编辑框里面
	protected void selectedTableRow(MouseEvent me) {
		// TODO Auto-generated method stub
		DefaultTableModel dft = (DefaultTableModel) classListTable.getModel();
		editClassNameTextField.setText(dft.getValueAt(classListTable.getSelectedRow(), 1).toString().trim());
		editClassInfoTextArea.setText(dft.getValueAt(classListTable.getSelectedRow(), 2).toString().trim());
	}

测试

给确认删除按钮,添加事件

编写ClassDao 提供删除操作

public boolean delete(int id) {
		String sql = "delete from s_class where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setInt(1, id);
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

编写代码进行删除

//删除按钮,绑定事件
		okDeleteBtnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				//抽取一个删除方法
				deleteClassAct(e);
			}
		});

// 删除班级操作
	protected void deleteClassAct(ActionEvent ae) {
		// TODO Auto-generated method stub
		if (JOptionPane.showConfirmDialog(this, "您确定删除么?") != JOptionPane.OK_OPTION) {
			return;
		}
		// 获取选中行的索引
		int index = classListTable.getSelectedRow();
		if (index == -1) {
			JOptionPane.showMessageDialog(this, "请选中要删除的数据!");
			return;
		}
		//获取表格模型
		DefaultTableModel dft = (DefaultTableModel) classListTable.getModel();
		// 获取选中行的第一列
		int id = Integer.parseInt(dft.getValueAt(classListTable.getSelectedRow(), 0).toString());
		ClassDao classDao = new ClassDao();
		if (classDao.delete(id)) {
			JOptionPane.showMessageDialog(this, "删除成功!");
		} else {
			JOptionPane.showMessageDialog(this, "删除失败!");
		}
		//查询数据
		setTable(new StudentClass());
	}

给确认修改按钮添加点击事件

编写ClassDao提供修改的方法

public boolean update(StudentClass sc) {
		String sql = "update s_class set name=?, info=? where id=?";
		try {
			Connection con = JDBCUtils.getConnection();
			PreparedStatement preparedStatement = con.prepareStatement(sql);
			preparedStatement.setString(1, sc.getName());
			preparedStatement.setString(2, sc.getInfo());
			preparedStatement.setInt(3, sc.getId());
			if (preparedStatement.executeUpdate() > 0) {
				return true;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return false;
	}

// 确认修改按钮绑定事件
		okEditButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				submitEditAct(e); 
			}
		});
//修改操作
	protected void submitEditAct(ActionEvent ae) {
		// TODO Auto-generated method stub
		ClassDao classDao = new ClassDao();
		int index = classListTable.getSelectedRow();
		if(index == -1){
			JOptionPane.showMessageDialog(this, "请选中要修改的数据!");
			return;
		}
		DefaultTableModel dft = (DefaultTableModel) classListTable.getModel();
		String className = dft.getValueAt(classListTable.getSelectedRow(), 1).toString();
		String classInfo = dft.getValueAt(classListTable.getSelectedRow(), 2).toString();
		String editClassName = editClassNameTextField.getText().toString();
		String editClassInfo = editClassInfoTextArea.getText().toString();
		if(StringUtil.isEmpty(editClassName)){
			JOptionPane.showMessageDialog(this, "请填写要修改的名称!");
			return;
		}
		if(className.equals(editClassName) && classInfo.equals(editClassInfo)){
			JOptionPane.showMessageDialog(this, "您还没有做任何修改!");
			return;
		}
		int id = Integer.parseInt(dft.getValueAt(classListTable.getSelectedRow(), 0).toString());
		StudentClass sc = new StudentClass();
		sc.setId(id);
		sc.setName(editClassName);
		sc.setInfo(editClassInfo);
		if(classDao.update(sc)){
			JOptionPane.showMessageDialog(this, "更新成功!");
		}else{
			JOptionPane.showMessageDialog(this, "更新失败!");
		}
		
		//修改后,再次查询数据
		setTable(new StudentClass());
	}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python重写父类的方法

Python重写父类的方法 在Python中&#xff0c;继承是一个常见的概念。通过继承&#xff0c;子类可以使用父类中定义的属性和方法。有时候&#xff0c;子类需要改变父类中的行为。这时候&#xff0c;可以通过重写父类的方法来实现这一目的。 什么是重写方法&#xff1f; 当一…

区块链生态发展

文章目录 前言以太坊的到来什么是图灵完备&#xff1f;什么是智能合约&#xff1f; 以太坊的应用去中心化应用 DApp代币发行 公有链&联盟链区块链应用总结 前言 前面的区块链文章有介绍区块链的诞生以及底层运行原理&#xff0c; 本文主要介绍一下区块链应用的发展&#x…

(八)灌溉系统-将nodejs部署到云服务器(未实现,思路供参考)

这里之后我就是升级优化了 如果不想再学习的话&#xff0c;前面的就足够用了 Node后端部署上线详细步骤及踩坑记录&#xff08;使用宝塔面板&#xff09;&#xff1a;参考文章 Xshelll7下载&#xff1a;教程 这里是成功连上了

如何使用 Terraform 和 Git 分支有效管理多环境?

作者&#xff5c;Sumeet Ninawe 翻译&#xff5c;Seal软件 链接&#xff5c;https://spacelift.io/blog/terraform-environments 通常我们使用 Terraform 将我们的基础设施定义为代码&#xff0c;然后用 Terraform CLI 在我们选择的云平台中创建制定的基础设施组件。从表面上看…

C++primer(第五版)第五章(语句)

5.1简单语句 一个语句在末尾加上分号;就变成了表达式语句.表达式语句的作用是执行表达式并丢弃掉求值结果(也可以用赋值运算符将求值结果存起来),不存起来的话,大多数表达式语句是没有什么实际用处的表达式语句,例如: int a10; a5; //这就是没什么用的表达式语句 ; …

《Linux操作系统编程》第四章 屏幕编程器vi : 了解屏幕编辑器vi的概述和基本操作命令

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

基于单片机自动控制的电动模型汽车

摘 要 本文研究了一种基于单片机自动控制的电动模型汽车。主要论述了自动循迹、避障、测距跟随等自动驾驶相关技术在模型车上的应用。 模型汽车以STM32为主控芯片&#xff0c;采用了多种传感器、驱动电机、控制舵机等检测与控制模块&#xff0c;实现了路径循迹行驶和检测避障的…

【python】numpy的array数组与pandas的DataFrame表格互相转换(图文代码超详细)

目录 0.环境 1.array数组和DataFrame表格的简单介绍 2.转换方式详解&#xff08;代码&#xff09; 0&#xff09;前提&#xff1a;【需注意】 1&#xff09;array转化为DataFrame 2&#xff09;DataFrame转化为array 3&#xff09;完整代码 0.环境 windows jupyter note…

英语统考错题集_作文题---网络教育统考工作笔记003

scholar 学者 下面是关于统考中的作文的如何书写,要打个照面,不能到时候蒙了 sincere 真诚的 cover 覆盖 excited 激动的 兴奋的 sincerely 真诚的 absent 缺勤的 citizen 公民 居民 每种题型都接触一下,然后后面有时间继续扩充中.. 152下上

ansible 变量与事实变量

Ansible变量与事实变量&#xff1a; 自定义变量&#xff1a; 变量可以在定义任务前进行定义&#xff0c;也可以从其他文件中调用。 下面我写了一个在任务前定义的变量&#xff0c;并用循环将其打印。 内部变量&#xff1a; 剧本如下&#xff1a; --- - hosts: localhostva…

基于51单片机开发的步进电机远程控制系统

摘 要 电机是日常生活中必不可少的一部分&#xff0c;同时也是一种常用的机电元件。步进电机是一种特殊的电机&#xff0c;相较于其他类型的电机&#xff0c;步进电机的优点更加突出、应用优势更加明显&#xff0c;广泛应用于各个领域。 本设计是基于单片机开发的步进电机远程…

力扣算法刷题Day47|休息日总结:动态规划之背包问题

背包问题 〉题型分类 解题套路 〉动规五部曲 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 解题技巧 〉递推公式 问背包装满后的最大价值&#xff1a;dp[j] max(dp[j], dp[j - weight[i]] value[i]) …

JMeter之简单控制线程组(Thread Group)组件的执行顺序

jmeter的线程类型一共有3种分别是setUp线程组、tearDown线程组和线程组 他们的执行优先级为 setUp线程组 > 线程组(Thread Group) > tearDown线程组 当存在多个线程组(Thread Group)&#xff0c;jmeter默认是同时执行的&#xff0c;也就是说是无序的&#xff0c;此时如果…

蓝桥杯单片机赛点数据包模块文件使用的注意事项

目录 蓝桥杯单片机赛点数据包模块文件使用的注意事项 前言&#xff1a; 正文&#xff1a; DS1302 IIC onewire 2023年赛点资源包数据包下载地址&#xff1a;https://download.csdn.net/download/qq_25218501/87965408?spm1001.2014.3001.5503 蓝桥杯单片机赛点数据包模块…

redis---基础(部署及常用命令)

目录 前言一、关系型数据库与非关系型数据库1. 关系型数据库2. 非关系型数据库3. 关系型数据库和非关系型数据库区别4. 非关系型数据库产生背景小结&#xff1a; 二、Redis简介1. 单进程快速的原因&#xff1a;2.epoll 机制优势&#xff1a; 三、Redis 具有以下几个优点四、red…

全国农信银CTF流量分析(凯撒会分析流量吗)

总的来说这题还是挺简单的。先分析流量过滤http 发现有f?ag提示&#xff0c;然后分析url 解析得到 &#xff1a;[Request URI: http://192.168.0.111/?codeif [ $(head f?ag | cut -c 1) G ] then sleep 1 echo success 发现是时间盲注 然后过滤 http.time > 1 对过滤…

《移动互联网技术》第三章 无线定位技术:掌握位置服务和室内定位的基本概念和工作原理

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

无线路由器解决方案 MR500E工业级4G路由器可实时监控4G信号强度

近年来&#xff0c;随着物联网技术的快速发展&#xff0c;越来越多的制造企业开始加速推进工业互联网的建设和应用。作为工业互联网的重要基础设施之一&#xff0c;工业级4G路由器也不断迭代升级&#xff0c;以满足企业多样化的应用需求。 无线路由器解决方案MR500E工业4G路由…

矩阵通引入AIGC,帮助企业挖掘用户线索

据CNNIC报告数据&#xff0c;截止2022年6月&#xff0c;我国网民规模达10.51亿&#xff0c;其中短视频用户规模为9.62亿&#xff0c;网络直播用户规模达7.16亿&#xff0c;占网民整体的68.1%。 庞大的用户体量为直播带货奠定了基础&#xff0c;给品牌商家提供了新流量阵地&…

winDbg 分析dump

一、linux 部属.netcore生成dump #当然默认是不支持的&#xff0c;需要用 ulimit 开启&#xff0c;这个命令可以用来配置当前系统资源的使用额度 ulimit -a #core file size 就是用来指定生成 dump 文件的大小&#xff0c;默认为 0&#xff0c;即表示不生成&#xff0c;我们临…