J2SE+swing客户端开发进阶总结

Hello , 我是恒。分享一个练手项目一本糊涂账,顺便帮站长宣传一下站点https://how2j.cn
本项目是基于Swing和JDBC开发的图形界面桌面应用,通过这个项目能运用锻炼J2SE知识和技能

结构

├───src/
│   ├───HutuMainFrame.java
│   ├───dao/
│   │   ├───CategoryDAO.java
│   │   ├───ConfigDAO.java
│   │   ├───RecordDAO.java
│   ├───entity/
│   │   ├───Category.java
│   │   ├───Config.java
│   │   ├───Record.java
│   ├───gui/
│   │   ├───frame/
│   │   │   ├───MainFrame.java
│   │   ├───listener/
│   │   │   ├───BackupListener.java
│   │   │   ├───CategoryListener.java
│   │   │   ├───ConfigListener.java
│   │   │   ├───RecordListener.java
│   │   │   ├───RecoverListener.java
│   │   │   ├───ToolBarListener.java
│   │   ├───model/
│   │   │   ├───CategoryComboBoxModel.java
│   │   │   ├───CategoryTableModel.java
│   │   ├───page/
│   │   │   ├───SpendPage.java
│   │   ├───panel/
│   │   │   ├───BackupPanel.java
│   │   │   ├───CategoryPanel.java
│   │   │   ├───ConfigPanel.java
│   │   │   ├───MainPanel.java
│   │   │   ├───RecordPanel.java
│   │   │   ├───RecoverPanel.java
│   │   │   ├───ReportPanel.java
│   │   │   ├───SpendPanel.java
│   │   │   ├───WorkingPanel.java
│   ├───service/
│   │   ├───CategoryService.java
│   │   ├───ConfigService.java
│   │   ├───RecordService.java
│   │   ├───ReportService.java
│   │   ├───SpendService.java
│   ├───startup/
│   │   ├───Bootstrap.java
│   ├───test/
│   │   ├───Test.java
│   ├───util/
│   │   ├───CenterPanel.java
│   │   ├───ChartUtil.java
│   │   ├───CircleProgressBar.java
│   │   ├───ColorUtil.java
│   │   ├───DateUtil.java
│   │   ├───DBUtil.java
│   │   ├───GUIUtil.java
│   │   ├───MysqlUtil.java

学习点

单例模式

SpendPanel类的实例通过instance变量来访问,使得监听器通过单例模式的面板访问组件

package gui.panel;import javax.swing.JLabel;public class SpendPanel {public static SpendPanel instance = new SpendPanel();JLabel lMonthSpend = new JLabel("本月消费");JLabel lTodaySpend = new JLabel("今日消费");/* .....*/private SpendPanel(){}
}

面板类与监听器类松耦合

GUI进阶

界面包规范
MainFrame 主窗体类,规划在gui.frame包下
消费一览面板类,规划在gui.panel包下
RecordPanel 记一笔面板类,规划在gui.panel包下
ToolBarListener 工具条监听器类,规划在gui.listener包下
BackupListener 备份监听器类,规划在gui.listener包下
界面工具类
GUIUtil.java开发图形界面的过程中,减少代码复用,作为工具类
设置按钮图标

public static void setImageIcon(JButton b, String fileName, String tip) {ImageIcon i = new ImageIcon(new File(imageFolder, fileName).getAbsolutePath());b.setIcon(i);b.setPreferredSize(new Dimension(61, 81));b.setToolTipText(tip);b.setVerticalTextPosition(JButton.BOTTOM);b.setHorizontalTextPosition(JButton.CENTER);b.setText(tip);
}

checkNumber、checkZero和checkEmpty方法用于验证用户输入的有效性

public static boolean checkNumber(JTextField tf, String input) {// ...
}public static boolean checkZero(JTextField tf, String input) {// ...
}

表单生成

设计

实体类Entity

配置信息Config类与配置信息表 config相对应,还有消费分类Category和消费信息类Record

package entity;public class Config {public int id;public String key;public String value;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getKey() {return key;}public void setKey(String key) {this.key = key;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}}
业务类

ConfigService 设置业务类,这个类是监听器直接调用的类,然后再通过ConfigService去调用ConfigDAO

package service;import dao.ConfigDAO;
import entity.Config;public class ConfigService {public static final String budget = "budget";public static final String mysqlPath = "mysqlPath";public static final String default_budget = "500";static ConfigDAO dao= new ConfigDAO();static{init();}public static void init(){init(budget, default_budget);init(mysqlPath, "");}
数据库CURD以及备份还原

CURD
不多说
工具类 MysqlUtil的创建
备份方法backup()通过Runtime调用mysqldump.exe进行备份
恢复方法recover通过Runtime调用mysql.exe进行数据的还原

    public static void backup(String mysqlPath, String backupfile) throws IOException {String commandFormat = "\"%s/bin/mysqldump.exe\" -u%s -p%s   -hlocalhost   -P%d %s -r \"%s\"";String command = String.format(commandFormat, mysqlPath, DBUtil.loginName, DBUtil.password, DBUtil.port,DBUtil.database, backupfile);Runtime.getRuntime().exec(command);}public static void recover(String mysqlPath, String recoverfile) {try {String commandFormat = "\"%s/bin/mysql.exe\" -u%s -p%s   %s ";String command = String.format(commandFormat, mysqlPath, DBUtil.loginName, DBUtil.password,DBUtil.database);Process p = Runtime.getRuntime().exec(command);OutputStream out = p.getOutputStream();String inStr;StringBuffer sb = new StringBuffer("");String outStr;BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(recoverfile), "utf8"));while ((inStr = br.readLine()) != null) {sb.append(inStr + "\r\n");}outStr = sb.toString();OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");writer.write(outStr);writer.flush();out.close();br.close();writer.close();} catch (Exception e) {e.printStackTrace();}}

最后

最后我没有列出所有精髓所在,特别是架构上。
对于我来说,还是有很多值得学习的地方

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

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

相关文章

Java进阶学习笔记28——StringJoiner

Java中,有没有即能高效,又能实现更方便的拼接呢? StringJoiner: JDK8才开始的,跟StringBuilder一样,也是用来操作字符串的,也可以看成是一个容器,创建之后里面的内容是可变的。 好…

C++发票四要素真伪查验、数电票查验

在数字化转型的浪潮下,财务管理作为企业运营的核心环节之一,正经历着前所未有的变革。近期,随着发票查验接口技术的不断成熟与创新,翔云发票查验接口平台为企业提供了便捷、高效的发票查验服务,极大地提升了企业的财税…

SpringBoot学习小结之RocketMQ

文章目录 前言一、架构设计1.1 架构图1.2 消息1.3 工作流程 二、部署2.1 单机2.2 集群 三、Springboot Producter3.1 准备3.2 pom依赖、yml 配置3.3 普通消息3.4 顺序、批量、延迟消息3.5 事务消息 四、Springboot Consumer4.1 配置4.2 普通Push消费4.3 回复4.4 集群和广播4.5 …

CompletableFuture的使用(详细)

引入 功能和灵活性: Future:是Java 5引入的接口,用于表示一个异步操作的未来结果。它提供了基本的异步操作支持,如检查是否完成、等待结果以及获取结果,但在处理结果、异常和组合等方面功能有限。 CompletableFuture&a…

Linux文件操作命令

马哥教育 Linux SRE 学习笔记 文件操作命令 显示当前工作目录 每个shell和系统进程都有一个当前的工作目录 CWD:current work directory 显示当前shell CWD的绝对路径 pwd命令: printing working directory -P 显示真实物理路径-L 显示链接路径(默认&…

Light_Future的C++框架的套利代码读取arbitrage_strategy.cpp

1. 套利策略的初始化函数,订阅两个数据 void arbitrage_strategy::on_init(subscriber& suber) {// 向订阅者注册两个交易代码的tick接收器。suber.regist_tick_receiver(_code1, this);suber.regist_tick_receiver(_code2, this);// 获取当前交易日。uint32_t trading_d…

SpringCloud配置文件bootrap

解决方案&#xff1a; 情况一、SpringBoot 版本 小于 2.4.0 版本&#xff0c;添加以下依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-context</artifactId> </dependency> 情况二、SpringBoot…

[集群聊天服务器]----(八)群组类、群组操作接口以及业务模块之创建群组,加入群组以及群组聊天

接着上文关于[集群聊天服务器]----(七)业务模块之一对一聊天、添加好友函数、好友类以及离线消息类的剖析。本章将对创建群组&#xff0c;加入群组以及群组聊天业务进行剖析。 群类 类似于User类&#xff0c;构建了Group类 #ifndef GROUP_H #define GROUP_H#include "g…

在Windows中安装Redis

一、下载Redis github链接&#xff1a;https://github.com/redis-windows/redis-windows/releases 二、安装 解压后点击start.bat文件即可启动服务 新开一个cmd窗口进入安装了Redis的文件夹输入redis-cli.exe -h 127.0.0.1 -p 6379连接Redis&#xff0c;见如下结果便是成功&…

sql-labs靶场环境搭建(手把手保姆级教学)

文章目录 一、sql-labs靶场简介&#xff1a;二、搭建过程1、资源下载2、配置文件&#xff1b;3、访问网站4、创建数据库 三、使用PhpStudy2018原因 一、sql-labs靶场简介&#xff1a; SQL-Labs 是一个实践环境&#xff0c;旨在用于数据库和 SQL&#xff08;结构化查询语言&…

某大型制造集团企业信息化建设总体规划设计方案(67页PPT)

方案介绍&#xff1a; 随着信息技术的飞速发展&#xff0c;企业信息化建设已成为提高管理效率、增强企业竞争力的重要手段。某大型制造集团为应对市场变化、提升管理水平、优化资源配置&#xff0c;决定进行全面深入的信息化建设。本方案旨在构建一个集生产、管理、销售、物流…

Java中的IO和NIO(New IO)有什么区别?

在Java编程中&#xff0c;IO&#xff08;Input/Output&#xff09;和NIO&#xff08;New IO&#xff09;是两个重要的概念&#xff0c;它们分别代表了Java中的传统IO和新的IO库。为了全面解释这两者之间的区别&#xff0c;我们将从技术难点、面试官关注点、回答吸引力和代码举例…

【DevOps】Jenkins + Dockerfile自动部署Maven(SpringBoot)项目

环境 docker_host192.168.0.1jenkins_host192.168.0.2 jenkins_host构建完成后把jar发布到docker_host&#xff0c;再通过dockerfile自动构建镜像&#xff0c;运行镜像 1 Jenkins安装 AWS EC2安装Jenkins&#xff1a;AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装…

T113调试7寸RGB屏

文章目录 软硬件介绍软件板卡屏幕 调试修改内核设备树修改U-Boot设备树 测试添加启动logo其它问题总结 软硬件介绍 软件 基于Tina5.0 SDK。 板卡 韦东山的T113工业板&#xff1a; 屏幕 韦东山的7寸RGB电容触摸屏&#xff1a; 调试 修改内核设备树 打开内核设备树<…

代码随想录算法训练营第四天| 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点 、 面试题 02.07. 链表相交、142.环形链表II

24. 两两交换链表中的节点 题目链接&#xff1a; 24. 两两交换链表中的节点 文档讲解&#xff1a;代码随想录 状态&#xff1a;没做出来&#xff0c;没有正确更新头节点&#xff0c;因为head和cur共享引用&#xff0c;会随着cur的移动&#xff0c;丢失之前存放的节点 错误代码&…

efuse xinpian

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 xx项目需要进行efuse烧录&#xff0c;之前都是单板环境&#xff0c;现补充裸板烧录教…

Java计算时间相差多少秒/localdatetime计算时间差

1、常用的计算时间差方法&#xff1f; 【将字符串的时间转化成LocalDateTime】 String time1"2024-01-01 10:25:10";LocalDateTime starttime1 LocalDateTime.parse(time1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));【LocalDateTime计算时…

51单片机-实机演示(按键)

书接上回。http://t.csdnimg.cn/4wSSW 目录 一.按下灭&#xff0c;松开亮 二.两个按键控制两个灯 三.点一下灯开&#xff0c;在按一下关 四。优化按键消抖 1.加入bit变量 一.按下灭&#xff0c;松开亮 代码 #include <reg52.h> //此文件中定义了单片机的一些特…

自定义函数python:深入解析与实操

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;函数的命名与规范 二、函数命名&#xff1a;遵循规范&#xff0c;易于…

利用阅读APP3.0目录展示要查看的内容01

喜欢读电子书的小伙伴往往会遇到一个问题&#xff0c;就是想要看书中某些内容&#xff0c;但是不知道具体章节&#xff0c;所以就用查找功能来查&#xff0c;但是呢查找功能查出来展示的结果并不直观。 比如想要阅读:青竹蜂云剑&#xff0c;大衍决&#xff0c;南宫婉&#xff0…