JavaFX之班级未交作业统计
前言
最近转移了系统平台,用上了Ubuntu1804版本系统,原来用C#写的Windows窗体软件也不能用了,而且自己在班级上每周都需要收作业,所以写了这个软件。这篇博客主要记录这个JavaFX应用的编写过程以及怎么使用,并且不会涉及代码。代码部分在github上面,并且都有详细的中文注释,希望这篇博客能为喜欢JavaFX的伙伴提供一些参考资料。本程序涉及的知识点有一些基础组件和布局的使用,组件用到Label,Button,布局用到StackPane,BorderPane,GridPane,VBox,ScrollPane,还有Excel文件的读取。这个应用程序是使用的MVC模型设计的(这个简单程序没有用到模型model),使用的JDK版本是1.8,使用maven管理项目,IDE使用的是IntelliJ Idea。如果喜欢请帮我Mark个Star,Github链接地址:https://github.com/quanbisen/homeworkstatistic
内容
内容我把它分为五部分:
- 逻辑分析
- 功能需求
- UI设计
- 逻辑处理
- 测试
1. 逻辑分析
在一般情况下,班级每一次的作业都会建立一个文件夹存放每一位同学提交的作业(word文件或文件夹),而且每一位同学提交的文件命名都是有规定的格式,我们老师要求是专业班级+学号+姓名,例如计科16409小涵,其中“计科164”是专业班级,“09”是班级内的学号,”小涵“是姓名,学号在这个班级里是唯一的。这样,要做一个未交作业统计就只需要列出存放作业文件夹内的所有文件或文件夹,然后根据学号与班级的名单进行比对即可得出未交作业的同学,最后把未交作业的同学名单存到作业文件夹的一个.txt文件中即可。
2. 功能需求
根据逻辑分析,功能需求应该要有以下:
- 提供班级名单的导入
- 提供作业的目录选择
- 提供统计结果的显示
- 提供统计结果的保存
- 提供业务逻辑的提示
3. UI设计
整个程序需要用到的组件不多,针对需要做业务逻辑的提示,所以根容器选用了StackPane,在StackPane最低下放置程序的主界面布局GridPane,当需要进行业务逻辑的提示时,就往StackPane上面添加一个Label组件显示业务逻辑的提示信息,提示信息其实是通过播放淡出Fade动画实现的,在动画播放完成后需要把这个提示信息的Label移除,所以主界面的设计主要是设计在GridPane容器上。
针对功能需求中的班级名单导入和作业目录选择,可以为班级名单导入和作业目录选择各占GridPane的一行,每一行都有各占GridPane的三列,第一列使用Label组件作为提示,第二列使用TextField组件作为选择的路径显示(TextField组件是输入文本框,可以自己输入路径),第三列使用带图片的Label作为路径选择的按钮。设计的效果如下图所示:
针对功能需求中统计结果的显示和保存,可以为统计结果显示和保存各占GridPane的一行。统计结果的显示占GridPane的三列,第一列使用Label组件作为提示,第二列使用了一个ScrollPane容器包裹VBox容器作为统计结果的显示(有多少位同学没交就往VBox容器添加多少个Label组件作显示),第三列使用了一个Button组件作为统计的触发按钮;统计结果的保存只需要使用一个Label组件设置一些背景样式,占据GridPane的一行,因为这个Label占据了一行,为了居中显示美化,在fxml文件中指定了这一列占据GridPane的三列(GridPane.columnSpan="3")。设计的效果如下图所示:
程序的最终主界面如下图所示:
4. 逻辑处理
整个程序的逻辑处理很简单,可分为四步,分别为选择班级excel文件、选择班级作业目录、进行作业统计和统计完成后进行保存。整个程序的操作流程可用下图描述:
4.1 选择班级excel文件
选择班级excel文件的目的是使程序获得班级名单进行匹配的数据源,这个操作的逻辑处理只是获取文件的句柄,并不涉及读取,读取在后面进行统计的时候再执行。所以这一步的需要用到的知识点只有JavaFX文件选择对话框的使用(FileChooser)以及文件选择完成后对TextFiel组件的文本更新操作。具体的流程图如下所示:
4.2 选择班级作业目录
选择班级作业目录的目的是可以列出目录下的上交作业来作比对统计,它和选择班级excel文件的逻辑处理大致相同,只是换成了使用JavaFX目录选择对话框(DirectoryChooser),而且不需要设置其它的文件筛选器这些,只需要设置标题方便理解就可以了。在选择了目录后更新TextField组件的文本信息。具体的流程操作如下所示:
4.3 作业统计
作业统计是本程序设计的核心,它需要完成的逻辑处理有对选择的excel文件读取、对作业目录下的文件或文件夹进行学号提取、把excel文件读取的班级学生名单学号和作业目录下的文件学号进行比对贴“未交”标签和对贴了“未交”标签的学生进行GUI显示。具体的流程图如下所示:
- excel文件读取
excel文件的读取需要用到第三方包,分别是commons-collections-3.2.1、org.apache.poi-3.6、org.apache.poi-ooxml-3.6和org.apache.poi-ooxml-schemas-3.6,详见maven的配置文件pom.xml中的dependencies标签,这里需要注意的是不同版本的包读取excel文件的方法会有差异。读取的逻辑处理可以用以下流程图描述:
- 作业目录下的文件或文件夹学号提取
学号提取是根据文件有固定的命名格式,提取文件夹下面的所有学号字符串,如计科16409小涵,只需要提取从第四个字符开始到第六个字符结束即可得到所需的学号信息。其大致的逻辑处理可用以下流程图描述:
- 学号比对贴标签
学号比对贴标签还需要把读取到的excel文件行集合提取学号和姓名存储到map数据集,组成<Key,Value>映射,其中Key为学号,Value为姓名。然后使用map中的keySet数据集与目录下的文件提取的fileKeySet进行比对。其大致的逻辑处理可用以下流程图描述:
- GUI显示贴了“未交”标签的学生
GUI显示贴了“未交”标签的学生是为贴了标签的学生的信息创建一个Label组件,然后添加到VBox容器即可,最后还有一个提示多少人未交。其大致的逻辑处理可用以下流程图描述:
4.4 保存
保存是把VBox容器中的Label信息存储到作业目录下的.txt文件即可。首先创建.txt文件,然后取出VBox容器的组件,遍历提取组件信息写入文件,最后提示文件写入成功。其大致的逻辑处理可用以下流程图描述:
5. 测试
测试部分这里只列举功能部分测试,UI提示部分就不一一展示了。测试的班级Excel文件内容如下图所示:
作业文件夹下的文件如下图所示:
其中学号为04、06和07的同学未交作业。
下面运行程序,选择班级excel文件路径和作业目录,单击“统计”按钮得到统计结果。
最后单击保存把信息存储到“未交作业名单.txt”
JavaFX之班级未交作业统计的更多相关文章
- ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息
在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提 ...
- list-循环小练习(作业已交未交)
报错 list index out of range : 超出下标 这个错误是因为在写stus列表的时候写成了如下stus=['小花,未交'] ,但是取下标的时候取的是stus[1]:实际该列表中 ...
- 使用 python 查看谁没有交作业
话说实验报告每天都要查人数,何不用程序实现 使用 python 查看谁没有交作业 version 1.0 程序嘛,肯定是可以改进的.使用该程序的前提是实验报告文件名中包含学号信息.将以上程序放在实验报 ...
- bzoj 3379 - [USACO2004] 交作业
Description 一个数轴上有 \(n \le 1000\) 个位置, 每个位置有一个时间 \(t_i\) 要求在 时刻 \(t_i\) 后, 至少经过该位置一次. (去交作业) 求从 \(0\ ...
- BZOJ 3379: [Usaco2004 Open]Turning in Homework 交作业
Description 贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶牛同学回家. 每门科目的老师所在的教室排列在一条长为H(1≤H≤1000)的走廊上,他们只在课后接收 ...
- python学习笔记(二)python基础知识(交作业)
交作业 #!/usr/bin/env python # coding: utf-8 # # 1. 每个用户购买了多少不同种类的产品 # filename = 'train.txt' import sy ...
- 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP
[BZOJ3379][Usaco2004 Open]Turning in Homework 交作业 Description 贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶 ...
- “妈妈再也不用担心我忘交作业了!”——记2020BUAA软工团队项目选择
写在前面 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 团队项目选择 项目简介 项目名称:北航学生资源整合和作业提醒平台 项目内容: 设计实现一 ...
- 交作业啊,python爬取58的页面
第一次写博文,好紧张啊,写这么烂怎么给别人看啊先做下总结: 刚开始学习python,自我感觉python写起来确实很方便,各种库,各种语法糖,不过刚接触,一下子记不下来这么多东西,总感觉乱乱的,用的多 ...
随机推荐
- JApiDocs(自动生成接口文档神器)
JApiDocs教程 前言 作为一名优秀的程序员来说,由于涉及到要与前端进行对接,所以避免不了的就是写接口文档.写完接口文档,一旦代码返回结果,参数等出现变动,接口文档还得随之改动,十分麻烦,违背了我 ...
- 十、TestNG分组测试
使用 groups 属性 package com.lc.tesgFenZu; import org.testng.annotations.AfterGroups; import org.testng. ...
- 在Linux下下载RPM包
在Linux下下载RPM包,但是不安装 在工作中经常会遇到离线安装RPM包的情况,下面是下载RPM包的方法 # 使用yum下载RPM包 yum -y install --downloadonly &l ...
- Python SQLALchemy框架
SQLALchemy SQLALchemy是Python中的一款优秀的ORM框架,它可以作用于任何第三方Web框架,如flask,tornado等框架. SQLALchemy相较于DjangoORM来 ...
- [日常摸鱼]bzoj1257余数之和
题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比 ...
- Spark内核-部署模式
Master URL Meaning local 在本地运行,只有一个工作进程,无并行计算能力. local[K] 在本地运行,有K个工作进程,通常设置K为机器的CPU核心数量. local[*] 在 ...
- Go加密算法总结
前言 加密解密在实际开发中应用比较广泛,常用加解密分为:"对称式"."非对称式"和"数字签名". 对称式:对称加密(也叫私钥加密)指加密和解 ...
- 7. 丈母娘嫌我不懂K8s的Service概念,让我去面壁
文章目录 怎么跟你说 Service的出现,就是 解决ip不固定的问题 ,怎么解决呢 ? 听小刘慢慢道来 当Pod宕机后重新生成时,其IP等状态信息可能会变动,Service会根据Pod的Label对 ...
- day019python之面向对象基础1
面向对象基础 目录 面向对象基础 1 面向对象基础 1.1 面向对象的由来 1.2 面向对象编程介绍 1.2.1 回顾面向过程设计 1.2.2 面向对象设计 2 类与对象 2.1 基本使用 2.2 示 ...
- Python 设计模式——单例模式
单例模式即确保类有且只有一个特定类型的对象,并提供全局访问点.因此通常用于日志记录.数据库操作.打印机后台处理程序等.这些程序在运行过程中只生成一个实例,避免对同一资源产生相互冲突的请求. 特点: 确 ...