Java实现家谱家族管理系统,图形化家谱家族树,单机应用程序
背景
算法与数据结构实验内容,使用Java+JavaFX,花了两个星期独自完成。
功能
(1)普通用户、超级管理员不同角色,不同角色登录后的权限各不相同,普通用户可以进行查询;超级管理员有对所有成员增加、删除和修改的权限。
现在的初始超级管理员:admin 123456
初始普通用户:user555 123123
(2)家谱中成员的信息中包含姓名、出生日期、婚否、地址、健在否、死亡日期(若其已死亡)等
(3)数据以序列化存储于文本文件中。(xxx.data)
每次正常关闭才可以保存修改成功
(4)增删查改。可按照姓名查询,输出成员信息(包括其本人、父亲、孩子的信息、所在辈分);按照出生日期查询成员名单。
(5)按出生日期对家谱中所有人排序。
(6)打开家谱时,提示当天生日的健在成员。
(7)输入任意两个姓名,能够查询这两个姓名之间的是否具有直系祖先后裔关系。
(8)以图形方式显示家谱。
数据结构说明
算法设计
总体流程设计
数据序列化和反序列化
这是一个对于普遍对象的写入和读取部分。
- 写:首先以文件输出位置为参数建立File类型对象,将其作为参数传入,建立文件输出流FileOutputStream对象,将其作为参数传入,建立对象输出流ObjectOutputStream对象,然后调用flush()方法把缓冲区的内容强制输出,最后将文件输出流close(),若不主动释放,它会持续占有资源。
- 读:创建流的方式类似写的前三步,然后调用ObjectInputStream实例的readObject()方法读取,最后关闭流。值得注意的是,在调用读取方法时读取Object类型,需要强制转换为存储时的类型。
在本程序中,每次进入登录界面读取可变数组类型的存储所有用户信息的数据,在登入后读取家谱树数据,在修改用户界面关闭时写入用户数据,在程序主界面正常关闭时进行两者的写入。
增删查改移动查询直系
首先要说明的是在实现中程序禁止了名字的重复,可重复部分在后面进行设计与分析。在对树结构有调整的操作中都需要再当前节点单独设置父母节点。在设置上父母是分离的两方,在需要绘制父母双方时可以只调整绘制程序实现。
- 查找:这是一个递归的过程,传递的参数为Member和名字,结束条件为要找的名字等同于当前Member的名字,内部递归的调用为对当前成员的每个子嗣作为Member传入参数。在此方法外部封装:设置重写方法传入家谱树根进行全局的查找。同时,因为我们计算过用于生日排序的链表,也可以通过链表查找。
- 插入(增加):每次先确认要插入的父母节点存在,将其设为要插入节点的父或母,将其加入插入节点的子女数组。
- 删除:与上述类似,递归地调用自己,当名字符合时获得父母节点然后将自己从父母节点的子女数组删除。这个操作会删除所有下属的节点。同时,因为是一个无返回的方法,删除时会把所有此名的节点全部删除。
- 修改不做赘述。
- 移动:先查找符合的需要转移的节点和目标父母节点,都存在时将其删除,而后加入目标子女,最后将改动成员及其子树递归重新计算世代数。
检查是否是直系亲属:两成员互相以对方为基点,在其子孙树下查找自己,如果有一方找到就是直系亲属。
可以重复的树的设计(未实现):
增加与删除全部同名没有问题,只是禁止了。
- 查找:在tree下维护一个静态列表,记录每个名字的个数,每次加入删除时需要修改,同时被删除的子孙都需要修改个数,像维护每一代个数(已实现)一样做成方法每次刷新。
查找与删除的定位:将在editcontroller中调用的方法定向为记录的界面右侧的member实例,每次给用户看一个,确定后对当前member删除,然后查找时做成查找与查找下一个,如果有同名可以查找下一个实例,根据list中的个数,通过在每个member类中新添加一个flag记录有没有被查过来实现,每次结束需要将flag归位,可以再次遍历来全部重置或者再开一个member类型数组记录已经查过的实例。 - 查找与删除的另一个思路:在基础的树外部再建立二维都可变数组,每个名字为第一参数,内数组存同名个体们,然后都通过这个二维数组定位到记录。
修改:通过查找下一个定位到个体后没有问题。
移动:同上,定位两个个体让用户确定。
#3 用户的增删查改
与上述类似,且使用数组,更简单。仅允许管理员操作,不可删除当前账户,对密码限制必须大于六位,用户名是否重复判断。
#3 家谱排序以及提示健在生日者
在树的类中单独维护一个静态的链表来记录排序,在Member类中重写compareTo()方法,变成比较两个成员生日大小。已经有一个或多个的情况,比较第一个,比第一个小插入0位置;已经有多个的情况,比较前后相邻两个,大于前而小于后就插入其中;如果不满足前两个情况,在末尾插入。对树所有子女成员递归,排序所有人到这个链表。提示健在生日着只需要遍历,对每一个人调用getIsAlive()确认存活,然后确认生日是否一致,满足的打印提示。
图形化
每次首先清空画布,重新统计树每一层(代)的人数,记录在generationCount数组中,用以计算每一层节点之间的距离,统一计算,存储于xGap数组中。Count是在绘制时记录画的进度,每画一个节点在其层数已画计数加一。每次对所有子女先计算并画线,然后递归调用方法本身。
另外,在本方法实现中也判断了当日生日且存活的成员并将其框画为蓝色。
间隔具体计算式子:
yGap = ((int)canvasHeight-2startY)/(generationCount.size()+1)-gridHeight;
xGap[i] = (((int)canvasWidth-2startX))/(generationCount.get(i))-gridWidth;
初始化处理:
初始化都是内置的单独方法,在图形化界面不可调用。树的初始化建立固定的根节点,用户信息的初始化建立固定用户名为admin,且密码为123456的管理员账户。
实验数据制造
我网上搜了个红楼梦关系图然后瞎编了一些个人信息:
实现效果:
登录
用户修改界面
在注册界面成功注册和登录错误提示
初始化的主界面
主界面
修改界面以及添加操作(使用管理员账户登录)
全部添加完成,刷新后界面
增删查改例子的截图不多赘述,类似,在我的报告里有
查询案例
查询两人是否有直属关系案例
仅供大家参考,学习,请勿原封不动使用
源文件以及解释(我写的报告)
CSDN下载:
https://download.csdn.net/download/violet_ever_garden/12579899
GitHub地址:
https://github.com/FrankYJY/Genealogy-Management-System
如果你觉得有帮助的话给颗Github星星吧
如果你做到了改进,可以成为这个project的contributor
b站解释视频:
可以参考定位哪段代码对应什么功能,不详讲
https://www.bilibili.com/video/BV1nz4y1X7rp/
Java实现家谱家族管理系统,图形化家谱家族树,单机应用程序相关推荐
- Java 入门-02-人机交互-图形化界面的小故事
人机交互的小故事 1981 年,IBM 和 wicrosoft 共同推出的 ms-dos 系统,在黑屏下面输入命令 1981 年 4 月 27 日,施乐公司推出了第一个有操作窗口的系统,引起了很大的轰 ...
- Java 网络编程之swing图形化QQ聊天室
Java写聊天室就要用到网络编程,TCP/UDP都可以,这里用UDP实现. 话不多说,先上图看效果 首先Java通过两个类实现UDP协议顶层的数据报:DatagramPacket对象是数据容器,Dat ...
- java 删除图形界面_Java图形化界面报错?
import java.awt.*; import java.awt.event.*; import javax.swing.*; import 测试新界面.Panel.DeletePlayer; i ...
- java图形界面美化_Java图形化编程美化
1.去掉原来的界面的装饰,改用自己装饰: 先看看效果,如下图 如何实现: 1.去掉原来的windows的装饰: this.setSize(340, 256); this.setUndecorated( ...
- java计算器布局设计_Java图形化界面设计——布局管理器之GridLayout(网格布局) 之计算器...
代码如下: import java.awt.*; import javax.swing.*; public class GridFrame extends JFrame { // 定义字符串数组,为按 ...
- java实现混合运算_java图形化界面实现简单混合运算计算器
写了好几天了终于写完了这个四则运算计算器,总代码放在后面 截图如下: 首先是布局都比较简单,最上面的一个框是总的输出框, 第二个框是每次输入的数字显示在框内, 对于每一个按钮都增加监听器, 对于数字按 ...
- Java做的毕业设计:图形化页面单机版————电脑内存小助手
软件存在的意义:电脑内存小助手,主要功能是分析每个文件夹的内存大小,方便管理电脑内存(这里的内存是指硬盘或者U盘),硬盘空间越来越少,不知道存储空间都分配到哪些文件夹去了:想更直观的浏览,管理文件,删 ...
- java的swing教程_java图形化Swing教程(一)
与多线程.泛型等不同,Swing主要在于使用. 以下主要放代码和凝视.少说话. (一)基本框架 package Swing; import java.awt.*; import javax.swing ...
- java之图形化界面(GUI)
一.概述 用户与计算机进行交换的方式有两种: GLI:Command lin User Interface(命令行用户接口),也就是常见的dos窗口,它需要记住一些常用的命令,操作不直观方便. GUI ...
最新文章
- linux pthread_join 使用记录
- 计算机应用基础项目化教程实训评价手册答案,计算机应用基础实训指导
- 动态对象泛型数组绑定控件 0107
- 红包算法——最大最小值范围
- 一次数据库优化的对话
- 试验设计方法与Design-Expert软件应用目录
- 第7章第21节:双图排版:两张图片左右并列排版 [PowerPoint精美幻灯片实战教程]
- 字节跳动校招题目——找零问题
- 计算机体系结构复习笔记
- 新款H3C服务器图形化界面配置raid
- 计算机三级网络app,App Store 上的“计算机三级网络技术题库”
- 利用Python实现自动批量图片格式转换
- 南京邮电大学c语言实验报告3v2,南京邮电大学操作系统实验报告
- 软件压缩卡与硬件压缩卡的比较
- 3.26黄金原油后市看涨吗?3.27原油白银td操作建议走势分析
- linux查看已挂载磁盘,linux查看与挂载磁盘
- 安卓、苹果手机数据转移时的备份以及恢复
- html square的作用,html里面的type标签square,怎么用?干吗的?
- 交叉熵的物理意义及简单公式推导
- gb g t计算机单位,t和g的换算(硬盘容量G跟T的换算)