Java+Swing: 数据回显和修改功能的实现 整理14

1. 数据回显

其实数据回显就是为修改功能的实现做准备的

1.1 在MainView类中,创建一个方法获取选中行的id 

    // 获取选中的行的idpublic int[] getSelectedRowIds() {int[] selectedRows = mainViewTable.getSelectedRows();int[] ids = new int[selectedRows.length];  // 用来存储idfor (int i = 0; i < selectedRows.length; i++) {int selectedRowIndex = selectedRows[i];Object idObj = mainViewTable.getValueAt(selectedRowIndex, 0);ids[i]= Integer.parseInt(idObj.toString()); // toString()是将转为字符串的类型}return ids;}

1.2 给按钮添加点击事件

 

1.3 在MainViewHandler进行相应的处理

 if ("修改".equals(text)){int[] selectedRowIds = mainView.getSelectedRowIds();if (selectedRowIds.length != 1) {JOptionPane.showMessageDialog(mainView, "请选择一条记录!");return;}new UpdateStudentView(mainView, selectedRowIds[0]);}

 

1.4 编写UpdateStudentView界面代码

与上一篇博客中的添加数据界面相同,直接给出代码了

package com.student_view;import com.entity.Student;
import com.handler.UpdateStudentViewHandler;
import com.service.Impl.StudentServiceImpl;import javax.swing.*;
import java.awt.*;/*** @Author:xiexu* @Date:2023/12/16 21:52*/
public class UpdateStudentView extends JDialog {// 声明一系列组件JPanel jPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 10, 20));JLabel idLabel = new JLabel("学号", JLabel.RIGHT);JTextField idTextField = new JTextField();JLabel nameLabel = new JLabel("姓名", JLabel.RIGHT); // 第二个参数表示水平的排列方式JTextField nameTextField = new JTextField();JLabel noLabel = new JLabel("学号", JLabel.RIGHT);JTextField noTextField = new JTextField();JLabel homeLabel =  new JLabel("家乡", JLabel.RIGHT);JTextField homeTextField = new JTextField();JLabel chineseLabel = new JLabel("语文成绩", JLabel.RIGHT);JTextField chineseTextField = new JTextField();JLabel mathLabel = new JLabel("数学成绩", JLabel.RIGHT);JTextField mathTextField = new JTextField();JLabel englishLabel = new JLabel("英语成绩", JLabel.RIGHT);JTextField englishTextField = new JTextField();JButton updateBtn = new JButton("修改");public UpdateStudentView(MainView mainView, int selectedRowId) {super(mainView, "修改学生信息",true);// 添加各组件到面板上idLabel.setPreferredSize(new Dimension(80, 30));jPanel.add(idLabel);idTextField.setPreferredSize(new Dimension(200, 30));jPanel.add(idTextField);nameLabel.setPreferredSize(new Dimension(80, 30));jPanel.add(nameLabel);nameTextField.setPreferredSize(new Dimension(200, 30));jPanel.add(nameTextField);noLabel.setPreferredSize(new Dimension(80, 30));jPanel.add(noLabel);noTextField.setPreferredSize(new Dimension(200, 30));jPanel.add(noTextField);homeLabel.setPreferredSize(new Dimension(80, 30));jPanel.add(homeLabel);homeTextField.setPreferredSize(new Dimension(200, 30));jPanel.add(homeTextField);chineseLabel.setPreferredSize(new Dimension(80, 30));jPanel.add(chineseLabel);chineseTextField.setPreferredSize(new Dimension(200, 30));jPanel.add(chineseTextField);mathLabel.setPreferredSize(new Dimension(80, 30));jPanel.add(mathLabel);mathTextField.setPreferredSize(new Dimension(200, 30));jPanel.add(mathTextField);englishLabel.setPreferredSize(new Dimension(80, 30));jPanel.add(englishLabel);englishTextField.setPreferredSize(new Dimension(200, 30));jPanel.add(englishTextField);jPanel.add(updateBtn);Container contentPane = getContentPane();contentPane.add(jPanel);setSize(350, 500);setLocationRelativeTo(null);// DISPOSE_ON_CLOSE  只销毁当前窗体setDefaultCloseOperation(DISPOSE_ON_CLOSE);setResizable(false);setVisible(true);}}

 

1.5 实现数据回显

就是根据传过来的id值,查询数据库,在展示到对应的表单中

1.5.1 接口 

Student getById(int selectedRowId);

1.5.2 实现类 

    // 根据 id 查询@Overridepublic Student getById(int selectedRowId) {StringBuilder sql = new StringBuilder();sql.append("select * from detail where id = ?");// 执行Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;Student student = new Student();// 返回的数据try {connection = DBUtil.getConnection();preparedStatement = connection.prepareStatement(sql.toString());preparedStatement.setInt(1, selectedRowId);resultSet = preparedStatement.executeQuery();  // 执行查询返回结果集while (resultSet.next()) {// 遍历查询的每一条记录int id = resultSet.getInt("id");String name = resultSet.getString("name");String no = resultSet.getString("no");String homeTown = resultSet.getString("homeTown");double chinese = resultSet.getDouble("chinese");double math = resultSet.getDouble("math");double english = resultSet.getDouble("english");student.setId(id);student.setName(name);student.setNo(no);student.setHomeTown(homeTown);student.setChinese(chinese);student.setMath(math);student.setEnglish(english);}return student;}catch (Exception e) {e.printStackTrace();} finally {DBUtil.closeRS(resultSet);DBUtil.closePS(preparedStatement);DBUtil.closeConnection(connection);}return null;}

 1.5.3 在updateStudentView中对返回的结果进行相应的处理

   // 查询selectedRowIds对应的数据并回显StudentServiceImpl studentService = new StudentServiceImpl();Student selectedStudent = studentService.getById(selectedRowId);

把返回的结果设置到相应的表单中,注意id需设为不可编辑 ,这里只给出了部分,其他的组件也是一样的写法

 

1.5.4 效果

 

 2. 修改数据

在上面的基础上,对修改数据的模态框进行处理

2.1 给模态框中的修改按钮添加点击事件

 

2.2 编写事件处理类updateStudentViewHandler

以下代码中给出了框架,具体的逻辑还没实现,具体的实现继续往下看

package com.handler;import com.entity.Student;
import com.service.Impl.StudentServiceImpl;
import com.student_view.MainView;
import com.student_view.UpdateStudentView;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;/*** @Author:xiexu* @Date:2023/12/18 17:33*/
public class UpdateStudentViewHandler implements ActionListener {private UpdateStudentView updateStudentView;private MainView mainView;public UpdateStudentViewHandler(UpdateStudentView updateStudentView, MainView mainView) {this.updateStudentView = updateStudentView;this.mainView = mainView;}@Overridepublic void actionPerformed(ActionEvent e) {JButton jButton = (JButton) e.getSource();String text = jButton.getText();if ("修改".equals(text)) {.......if (...) {// 重新加载表格查到最新数据mainView.reloadTable();updateStudentView.dispose();} else {// 添加错误,给出提示JOptionPane.showMessageDialog(updateStudentView, "添加失败");}}}
}

2.3 在updateStudentView中实例化

需要传递两个参数,这边将mainView传过去,是便于修改数据成功后,调用reloadTable方法,重新加载表格。

    UpdateStudentViewHandler updateStudentViewHandler;updateStudentViewHandler = new UpdateStudentViewHandler(this, mainView);

 

2.4 实现数据的修改操作逻辑

2.4.1 接口

 boolean update(Student student);

2.4.2 实现类

    // 修改/更新@Overridepublic boolean update(Student student) {StringBuilder sql = new StringBuilder();sql.append("update detail set name=?, no=?, homeTown=?, chinese=?, math=?, english=?");sql.append("where id = ?");// 执行Connection connection = null;PreparedStatement preparedStatement = null;ResultSet resultSet = null;TableDTO tableDTO = new TableDTO(); // 返回的数据try {connection = DBUtil.getConnection();preparedStatement = connection.prepareStatement(sql.toString());preparedStatement.setString(1, student.getName());preparedStatement.setString(2, student.getNo());preparedStatement.setString(3, student.getHomeTown());preparedStatement.setDouble(4, student.getChinese());preparedStatement.setDouble(5, student.getMath());preparedStatement.setDouble(6, student.getEnglish());preparedStatement.setInt(7,student.getId());return preparedStatement.executeUpdate() == 1;  // 执行查询返回结果集}catch (Exception e) {e.printStackTrace();} finally {DBUtil.closeRS(resultSet);DBUtil.closePS(preparedStatement);DBUtil.closeConnection(connection);}return false;}

2.4.3 补全上述的代码

 

 2.4.4 上述也是需要一个方法将属性值封装成一个对象

 public Student builStudent() {Student student = new Student();student.setId(Integer.valueOf(idTextField.getText()));student.setName(nameTextField.getText());student.setNo(noTextField.getText());student.setHomeTown(homeTextField.getText());student.setChinese(Double.parseDouble(chineseTextField.getText()));student.setMath(Double.parseDouble(mathTextField.getText()));student.setEnglish(Double.parseDouble(englishTextField.getText()));return student;}

 

 

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

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

相关文章

第六届江苏人工智能大会成功举办,赛氪网荣获“优秀合作伙伴”奖项

2023年12月15日&#xff0c;第六届江苏人工智能大会在南京成功举办。本次大会汇集了众多人工智能领域的专家、学者和企业代表&#xff0c;共同探讨人工智能技术的最新发展和应用。江苏人工智能大会由江苏省人工智能学会&#xff08;简称&#xff1a;JSAI&#xff09;创办于2018…

【每日一题】反转二叉树的奇数层

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;广度优先搜索方法二&#xff1a;深度优先搜索 写在最后 Tag 【深度优先搜索】【广度优先搜索】【二叉树】【2023-12-15】 题目来源 2415. 反转二叉树的奇数层 题目解读 反转二叉树奇数层的节点。 解题思路 对于二叉…

【LeetCode刷题笔记(8-1)】【Python】【接雨水】【动态规划】【困难】

文章目录 引言接雨水题目描述提示 解决方案1&#xff1a;【动态规划】结束语 接雨水 引言 编写通过所有测试案例的代码并不简单&#xff0c;通常需要深思熟虑和理性分析。虽然这些代码能够通过所有的测试案例&#xff0c;但如果不了解代码背后的思考过程&#xff0c;那么这些代…

C++指针

本文章对C指针的使用做一个全面的阐述与解释 1.1指针的定义使用 指针&#xff1a; 通过指针间接访问内存 指针就是地址 看下面代码&#xff1a; #include<iostream> using namespace std; int main(){//1、定义指针int * p;int a 10;//2、使用指针p &a;cout<…

STM32-02-STM32基础知识

文章目录 STM32基础知识1. STM32F103系统架构2. STM32寻址范围3. 存储器映射4. 寄存器映射 STM32基础知识 1. STM32F103系统架构 STM32F103 STM32F103是ST公司基于ARM授权Cortex M3内核而设计的一款芯片&#xff0c;而Cortex M内核使用的是ARM v7-M架构&#xff0c;是为了替代…

根据星历文件实现卫星的动态运行模拟matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .................................................................................... % …

测试用例的修改更新

测试用例的修改更新是指测试过程中由于用户需求的改变&#xff0c;或者测试过程中发现有新的需求产生&#xff0c;使得测试用例需要进行修改。修改更新测试用例不仅是一种测试技术&#xff0c;更是一种质量保证的方法。但修改和更新测试用例的技术要点在于&#xff1a; 1、执行…

Note3---初阶二叉树~~

目录​​​​​​​ 前言&#x1f344; 1.树概念及结构☎️ 1.1 树的概念&#x1f384; 1.2 树的相关概念&#x1f99c; 1.2.1 部分概念的加深理解&#x1f43e; 1.2.2 树与非树&#x1fab4; 1.3 树的表示&#x1f38b; 1.4 树在实际中的运用&#xff08;表示文件系统…

RT-Smart elf 动态加载技术 : 开启 ldso 动态加载

前言 RT-Smart,类似于Linux,可以动态的加载运行 应用程序 elf 文件 应用程序 elf 文件,有的是静态链接编译的,有的是动态链接编译的,动态链接编译的,还需要加载 动态共享库 (.so) 本篇讲解一下 RT-Smart 上 elf 动态加载功能的实现,顺便讲一下动态加载的原理 环境搭建 R…

RTrPPG

研究背景 心率 (HR) 和脉搏率变异性 (PRV) 是允许分析心脏行为的两个生理参数。心率监测可以通过接触式和非接触式的两种方法进行。通常用于测量 HR 和 PRV 的两种接触式技术是心电图 (ECG) 和光电容积脉搏波 (PPG)。 ECG 测量由心脏活动引起的电场。另一方面&#xff0c;PPG …

02什么是CPU上下文切换

上⼀节&#xff0c; 讲了要怎么理解平均负载&#xff08; Load Average&#xff09; &#xff0c; 并⽤三个案例展示了不同场景下平均负载升⾼的分析⽅法。 这其中&#xff0c; 多个进程竞争 CPU 就是⼀个经常被我们忽视的问题。 1、CPU上下文切换的概念 我想你⼀定很好奇&am…

2023/12/18 work

1. 机械臂 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <myhead.h>#define CLI_PORT 6667 //本机的端口号 #define CLI_IP "192.168.125.79" //本机的IP#define SER_PORT 8888 //服务器的端口号 #define…

智能家居和智能家居控制设备有什么区别?

智能家居和智能家居控制设备在功能和用途伤的区别&#xff1a; 智能家居是一种整体的概念&#xff0c;它涵盖了整个家庭环境的智能化&#xff0c;包括智能家电、智能照明、智能安防等设备的互联互通和协同工作。智能家居的目标是通过中央控制器或智能音箱等设备&#xff0c;实现…

瑞安籍侨领池万进荣任意大利瑞安同乡总会第五届会长

浙江温州瑞安是全国重点侨乡&#xff0c;拥有海外侨胞16万人、侨领2100多名、归侨侨眷近12万人&#xff0c;在世界100多个国家和地区建有70多个侨团组织。 意大利瑞安同乡总会第五届理事会会长团全体成员 青年部全体成员 各兄弟会长及代表 12月10日&#xff0c;意大利瑞安同乡…

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用

LabVIEW在燃气轮机发电机组励磁控制系统测试中的应用 燃气轮机发电机组作为一种高效可靠的常备应急电源&#xff0c;在保障发电品质稳定性和可靠性方面发挥着关键作用。其中&#xff0c;励磁控制系统是保证供电质量的重要环节&#xff0c;对发电机组的稳定运行至关重要。为了有…

档案数字化管理可以提供什么服务?

档案数字化管理提供了便捷、高效和安全的档案管理服务&#xff0c;帮助组织更好地管理和利用自己的档案资源。 具体来说&#xff0c;专久智能档案数字化管理可以提供以下服务&#xff1a; 1. 档案扫描和数字化&#xff1a;将纸质档案通过扫描仪转换为数字格式&#xff0c;包括文…

Peter算法小课堂—简单建模(4)

太戈编程1655题 一条直线上&#xff0c;你安排了n个哨兵站岗放哨&#xff0c;编号从1到n。其中i号哨兵的坐标位置是x[i]。不会有哨兵站在相同的位置。作为指挥官&#xff0c;你需要知道3个信息&#xff1a; 1.从左到右&#xff0c;每个哨兵的坐标依次是几? 2.从左到右&…

当抖店有订单支付或确认时,无需人工操作,通过自动化流程实现自动解密电话号码并发送引流短信,高效转化私域用户

1 场景描述 为了提高用户体验&#xff0c;越来越多的企业正转向使用抖音小店来销售产品或扩大其粉丝群。在线教育行业尤其倾向于以抖店为其主要销售平台。这些公司通常会在抖店上销售试听课程&#xff0c;并通过抖店获取的用户手机号码发送短信&#xff0c;进而将潜在客户引导到…

开发企业展示小程序的关键步骤和技巧

随着移动互联网的快速发展&#xff0c;小程序已经成为企业展示形象、推广产品和服务的重要工具。拥有一个优秀的小程序可以帮助企业提高品牌知名度&#xff0c;吸引更多潜在客户&#xff0c;提升用户体验。以下是拥有一个展示小程序的步骤&#xff1a; 确定需求和目标 首先&am…

【深度学习】序列生成模型(二):束搜索

文章目录 序列生成束搜索理论基础算法步骤python实现 序列生成 在进行最大似然估计训练后的模型 p θ ( x ∣ x 1 : ( t − 1 ) ) p_\theta(x | \mathbf{x}_{1:(t-1)}) pθ​(x∣x1:(t−1)​)&#xff0c;我们可以使用该模型进行序列生成。生成的过程是按照时间顺序逐步生成序…