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写起来确实很方便,各种库,各种语法糖,不过刚接触,一下子记不下来这么多东西,总感觉乱乱的,用的多 ...
随机推荐
- Java并发编程的艺术(九)——闭锁、同步屏障和信号量
闭锁:CountDownLatch 使用场景 当前线程需要等待若干条线程执行完毕后,才能继续执行的情况. 也可以是若干个步骤执行完毕后的情况. 使用方法 初始化闭锁的时候,填入计数值,然后等待其他线程 ...
- 七牛云SDKLinux环境下C SDK的编译(转)
1.下载代码到本地 git clone https://github.com/qiniu/c-sdk.git 如果国外下载速度慢,可以用码云的镜像库 git clone https://gitee.c ...
- Python排序函数用法
Python排序函数完美体现了Python语言的简洁性,对于List对象,我们可以直接调用sort()函数(这里称为"方法"更合适)来进行排序,而对于其他可迭代对象(如set,di ...
- 【面试专栏】JAVA CAS(Conmpare And Swap)原理
1. CAS简介 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令.它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新 ...
- 超详细分析Bootloader到内核的启动流程(万字长文)
@ 目录 Bootloader启动流程分析 Bootloader第一阶段的功能 硬件设备初始化 为加载 Bootloader的第二阶段代码准备RAM空间(初始化内存空间) 复制 Bootloader的 ...
- Java中字符串替换方法
replaceAll方法 public String replaceAll(String regex, String replacement) replace方法 public String repl ...
- 多任务-python实现-Thread的基本使用(2.1.1)
@ 目录 1.多任务的概念 2.线程 1.多任务的概念 "多任务工作"指的是当前很普遍的工作状态,一个人同时处理多件事情,比如以下这个常见的画面:写一会报告,刷一下网页,查一下资料 ...
- kali2020.01修改root终端颜色
kali2020.01非root用户的终端和root用户终端颜色存在较大差异: 修改配置,将非root用户的配置替换root用户,输入以下命令即可: cd /home/lijingrong //切换到 ...
- Unity 打包Shader优化
我们一直以来的项目Shader基本都会打包到一个package里面,游戏启动时会进行预加载这个Package,且预加载其中一些常用的Shader,最近新发现一个坑点,那就是shader依赖了特效的一些 ...
- ubuntu20部署php-swoole开发环境
第1步:安装依赖 add-apt-repository ppa:ondrej/php apt install php-dev 第2步:编译安卓swoole wget https://codeload. ...