前言

  最近转移了系统平台,用上了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

内容

  内容我把它分为五部分:

  1. 逻辑分析
  2. 功能需求
  3. UI设计
  4. 逻辑处理
  5. 测试

  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之班级未交作业统计的更多相关文章

  1. ThinkPHP5作业管理系统中处理学生未交作业与已交作业信息

    在作业管理系统中,学生登陆到个人中心后可以通过左侧的菜单查看自己已经提交的作业和未提交作业.那么在系统中如何实现这些数据的查询的呢?首先我们需要弄清楚学生(Student).班级(class).作业提 ...

  2. list-循环小练习(作业已交未交)

    报错 list index out of range : 超出下标   这个错误是因为在写stus列表的时候写成了如下stus=['小花,未交'] ,但是取下标的时候取的是stus[1]:实际该列表中 ...

  3. 使用 python 查看谁没有交作业

    话说实验报告每天都要查人数,何不用程序实现 使用 python 查看谁没有交作业 version 1.0 程序嘛,肯定是可以改进的.使用该程序的前提是实验报告文件名中包含学号信息.将以上程序放在实验报 ...

  4. bzoj 3379 - [USACO2004] 交作业

    Description 一个数轴上有 \(n \le 1000\) 个位置, 每个位置有一个时间 \(t_i\) 要求在 时刻 \(t_i\) 后, 至少经过该位置一次. (去交作业) 求从 \(0\ ...

  5. BZOJ 3379: [Usaco2004 Open]Turning in Homework 交作业

    Description     贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶牛同学回家. 每门科目的老师所在的教室排列在一条长为H(1≤H≤1000)的走廊上,他们只在课后接收 ...

  6. python学习笔记(二)python基础知识(交作业)

    交作业 #!/usr/bin/env python # coding: utf-8 # # 1. 每个用户购买了多少不同种类的产品 # filename = 'train.txt' import sy ...

  7. 【BZOJ3379】[Usaco2004 Open]Turning in Homework 交作业 DP

    [BZOJ3379][Usaco2004 Open]Turning in Homework 交作业 Description     贝茜有C(1≤C≤1000)门科目的作业要上交,之后她要去坐巴士和奶 ...

  8. “妈妈再也不用担心我忘交作业了!”——记2020BUAA软工团队项目选择

    写在前面 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任建) 这个作业的要求在哪里 团队项目选择 项目简介 项目名称:北航学生资源整合和作业提醒平台 项目内容: 设计实现一 ...

  9. 交作业啊,python爬取58的页面

    第一次写博文,好紧张啊,写这么烂怎么给别人看啊先做下总结: 刚开始学习python,自我感觉python写起来确实很方便,各种库,各种语法糖,不过刚接触,一下子记不下来这么多东西,总感觉乱乱的,用的多 ...

随机推荐

  1. Docker安装rocketmq踩坑指南

    Docker 网络 Docker容器运行的时候有host.bridge.none三种网络可供配置. 默认是bridge,即桥接网络,以桥接模式连接到宿主机:host是宿主网络,即与宿主机共用网络:no ...

  2. STL——容器(deque) deque 的大小

    1. deque 的大小 deque.size();              //返回容器中元素的个数 1 #include <iostream> 2 #include <dequ ...

  3. Java-Word转PDF

    1. 下载jar包或者引入pom.xml 下载:https://www.e-iceblue.cn/Downloads/Free-Spire-Doc-JAVA.html 引入pom.xml:https: ...

  4. feign代码自动生成插件

    简介 feign对微服务之间的http调用做了一层封装,如果B项目想调用A项目的一个web服务,只需要编写对应的接口并标注FeignClient注解.但如果接口发生了变更,对应的Feign代码往往会忘 ...

  5. Docker(四):Docker安装Redis

    查找Redis镜像 镜像仓库 https://hub.docker.com/ 下拉镜像 docker pull redis 查看镜像 docker images 创建Redis容器 运行Redis镜像 ...

  6. 配置OSPF与BFD联动

    组网图形 OSPF与BFD联动简介 双向转发检测BFD(Bidirectional Forwarding Detection)是一种用于检测转发引擎之间通信故障的检测机制.BFD对两个系统间的.同一路 ...

  7. Spark参数优化

    a. 提升Spark运行 spark.sql.adaptive.enabled=true spark的自适应执行,启动Adaptive Execution spark.dynamicAllocatio ...

  8. 仙剑4CPK加密解密算法(转)

    // RSTEncDec.h: interface for the CRSTEncDec class. // ///////////////////////////////////////////// ...

  9. Core3.0返回的数据格式xml或json

    前言 此方法从百度得,原文链接找不到了 步骤 //WebAPI接口返回xml格式,由Accept.application决定 services.AddMvc(opt => { opt.Respe ...

  10. [UWP] - 用Json格式来发送一个Post请求到WCF服务

    测试实体类:(需要在客户端和服务端建了有相同字段名称的实体) public class CompositeType { public CompositeType() { SubCompositeTyp ...