一个使用javafx编写电子相片管理程序

项目源代码在gitbub上,请点击这里

1. 系统分析

前言:随着数码相机的普及,越来越多的人拥有大量的数字像片。本程序的目的是编写一个能够对数字像片进行管理和查看的应用程序。

1.1 问题描述

图片管理器可作为计算机使用者浏览各种格式图片的载体而存在,作为人们日使用计算机工作的一大可视化工具。随着手机的日益普及,个人相片的数量呈现指数级增长。因此,一款出色的图片管理程序便显得尤为必要。

1.2 系统功能分析

1.2.1 必须实现的功能

• 目录树功能

• 图片选择功能(包括单张和多张图片的选择,选中方式有两种:鼠标框中和ctrl+鼠标右键)

• 图片查看功能(支持等格式)

• 图片放大缩小功能

• 图片删除功能

• 图片复制功能

• 图片重命名功能(多选状态下,图片命名由“用户命名”+递增的序号 组成)

1.2.2 额外实现的功能

• 多种风格的图片滤镜,共有六种滤镜(Original、Overlay、Sepiatone、Bloom、Mercury、Exclusion),并且支持灰度滑条和添加滤镜后导出。

• 幻灯片功能:支持多种风格的幻灯片播放样式

• 截图功能:支持屏幕任意位置截图

1.3 开发平台及工具介绍

1.3.1 开发平台:windows 10

开发工具:
①、IDE—eclipse oxygen 2018

​ ②、SceneBuilder:**

JavaFX Scene Builder 是一个可视化布局工具,可快速 设计 JavaFX 应用程序用户界面,无需编写代码。用户可以拖放UI 组件到工作区,修改组件的属性,应用样式表,而且在后台自动生成所创建布局的 FXML 代码。最后得到的是一个可以稍后与 Java 项目整合到一起的 FXML 文件,从而将 UI 与应用程序逻辑绑定起来。

1.3.2 使用语言:javaFX 和 Java8

2. 系统设计

2.1 系统的总体结构:

本程序使用MVC模式,进行整体项目的架构

2.1.1 MVC模式简介

MVC模式将交互式应用分成模型(Model)、视图(View)和控制器(Controller)三部分。

① 、模型是指从现实世界中挖掘出来的对象模型,是应用逻辑的反映。模型封装了数据和对数据的操作,是实际进行数据处理的计算的地方。

② 视图是应用和用户之间的接口,它负责将应用显现给用户和显示模型的状态。

③ 、控制器负责视图和模型之间的交互,控制对用户输入的响应响应方式和流程,它主要负责两方面的动作:把用户的请求分发到相应的模型;将模型的改变及时反应到视图上。

MVC将这些对象分离以提高灵活性和复用性。MVC模式的结构如下图所示:

本程序使用javaFX和SceneBuilder作为开发语言和界面设计工具,其天生便符合MVC开发模式。

2.1.2 项目结构设计

① 、Model:本项目自我编写了

• PictureFile模型对图片文件的数据产生和列表等操作进行了封装。

• PictureNode 模型通过扩展Label类,自定义了包含ImageView和Text的图片节点,内部封装了各种鼠标事件的监听器,是整个项目数据操作的主要来源。

• MyContextMenu 模型封装了整个项目的鼠标右击事件和数据操作处理

• TreeFile 模型为TreeView遍历系统目录树提供数据封装以及数据处理

② 、Controller:借助javaFX 及 Scenebuilder,我们通过.fxml文件进行界面设计,本处Controller均是基于.fxml文件自动生成。

• MainUIController:主界面的控制器,响应用户的鼠标操作,并将其呈现在视图上,例如用户的目录树点击操作、打开复制粘贴剪切删除重命名等操作。

• ViewUIController:图片查看界面的控制器,将用户的操作分发到ImageView模型上,并将模型的改变反应到视图上,提供人机交互。

③ 、View:使用Scenebuilder进行可视化人机交互界面设计。

• MainUI.fxml 主界面布局文件

• ViewUI.fxml 图片查看界面布局文件

④ 、action:为了提高项目的可读性和可重用更改性,将所有界面的Button的相应操作封装到一个包内。

⑤ 、service: 为整个项目供服务,包括数据链接服务(DataService)、界面转换服务(ChangeService)、鼠标监听服务(MouseEvenHandler和PaneListener)

2.2 系统各个类及类之间的关系设计

2.3 数据存储的设计

本程序数据存储设计较为简单,仅使用了自定义的ArrayList 对象链表和image文件的读写,不涉及数据库等复杂数据存储设计。

2.4 界面设计

我们知道JavaFX自从2.0版本开始,已经完全抛弃了之前的script语言,才用纯java来实现。这样的好处就是1.让使用Java的IDE进行JavaFX的开发成为可能,2.Java与JavaFX的API相互调用更容易 3.JavaFX的程序部署也更简单。

2.4.1 使用Scenebuilder 进行界面设计的注意点:

① 、fx:id是一个很重要的属性,在事件逻辑层要获取JavaFX Scene Builder编辑的XML中的控件,需要通过fx:id来获取。

② 、可在右边属性的events中指定事件的方法。如下图所示,Menu中的Open事件对应onMenuOpen方法。

③ 、Stage是JavaFX最顶层的容器,最原始的Stage(也就是start方法后的参数)是根据系统平台进行创建的(也是跨平台的重点)。当然,你也可以在程序其他地方创建Stage。

Scene是包括控件等所有内容的容器,应用程序必须指定Scene的根节点。既可以像上面代码中初始化时传入根节点,也可以通过setRoot方法来设定根节点。

Parent是所有包含子节点的节点的基类。它是一个继承于Node的抽象类。因此Loader里其实是用到了向上转型。

④ 、JavaFX使用很常见的反射机制将UI层和事件层完全分离了。查看上面的study.xml,你就可以看到根节点有一个fx:controller属性。这个属性就是指定事件处理的类。

2.4.2 主要界面演示

、主界面:

、查看图片界面:

、美化图片界面:

、幻灯片界面:

3. 系统实现

3.1 程序框图

3.1.1 PictureNode 的 实现:

本类是我们小组写的最重要的一个model,我们在主界面除了treeView之外,所有的操作包括选中状态的高亮,右键菜单,鼠标框选等等,一下是重写listener的 invalidated方法,是该PictiureNode在被鼠标点选后,显示蓝色高亮状态。

3.1.2 MainUIController右边flowPane中PictureNode被框选时的高亮状态:

监听鼠标,当鼠标被按下时,初始化选择矩阵的左上角,当鼠标放开,更新选择矩阵的左上角及边长,通过数学运算,将矩阵中包含的PictureNode节点返回给ArrayList selectedPictures = new ArrayList<>();代码如下

3.1.3 图片放大缩小的实现,代码如下:

3.1.4 幻灯片的实现,通过Timeline进行定时,使用定时下一张关键帧(图片),在加ImageView的特效转换,如imageview.setEffect和setViewport setRotate等,代码如下:

一个使用javafx编写电子相片管理程序相关推荐

  1. everest命令_认识Everest:一个用JavaFX编写的漂亮的REST API测试客户端

    everest命令 今天,我们正在探索即将用JavaFX编写的REST API测试客户端. 认识Everest ,以前称为RESTaurant. 珠穆朗玛峰(Everest)依靠的是资源,React灵 ...

  2. idea 编写javafx_用JavaFX编写图块引擎

    idea 编写javafx 随着JavaFX嵌入式版本的问世,我们的框架对于游戏开发变得越来越有趣,因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备. 因此,我决定对JavaFX进行更多的游戏编 ...

  3. 用JavaFX编写图块引擎

    随着JavaFX嵌入式版本的问世,我们的框架对于游戏开发变得越来越有趣,因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备. 因此,我决定对JavaFX进行更多的游戏编写实验. 这次,我想使用Ca ...

  4. javafx 教程_用JavaFX编写图块引擎

    javafx 教程 随着JavaFX嵌入式版本的问世,我们的框架对于游戏开发变得越来越有趣,因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备. 因此,我决定对JavaFX进行更多的游戏编写实验. ...

  5. Java黑皮书课后题第8章:*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1。让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了

    *8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1.让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了 题目 题目描述与运行示例 破题 代码 题目 题 ...

  6. Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开

    6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数.编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开 题目 题目描述 破题 代码 题目 题目描述 ...

  7. Java黑皮书课后题第5章:*5.46(倒排一个字符串)编写一个程序,提示用户输入一个字符串,然后以反序显示该字符串

    5.46(倒排一个字符串)编写一个程序,提示用户输入一个字符串,然后以反序显示该字符串 题目 题目概述 破题 运行示例 代码 题目 题目概述 5.46(倒排一个字符串)编写一个程序,提示用户输入一个字 ...

  8. Java黑皮书课后题第3章:**3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形。编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内

    **3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形.编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内 题目 题目描述 破题 运行示例 代码 题目 题目描述 ...

  9. 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结

    假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点).pat ...

最新文章

  1. python使用textwrap包在已经生成的长字符串中嵌入回车符实战
  2. php扇形分布图,PHP制作3D扇形统计图以及对图片进行缩放操作实例
  3. 趣谈Linux操作系统学习笔记:用户态内存映射:如何找到正确的会议室?(第25讲)...
  4. 专业人士提升数据中心职业生涯的6件事
  5. python报错 TypeError: an integer is required
  6. java计算二叉树的节点最小值_java计算二叉树的高度以及叶节点个数
  7. SharePoint【调试,诊错系列】-- 开发环境中不同调试对象的Attach方式
  8. jmeter聚合报告如何添加单位_JMeter聚合报告(Aggregate Report)理解
  9. mysql如何获取句柄_关于获取进程句柄的问题
  10. honeywell新风系统控制面板说明_新风系统——不开窗也能清新呼吸
  11. java 进度条 不更新_java进度条不动怎么解决?
  12. 项目管理的五个过程和九大知识领域
  13. IIS7管理器设置网站首页
  14. python中的单引号和双引号有什么区别_python中双引号和单引号的区别是什么
  15. mysql防止商品超卖_避免商品超卖的4种方案
  16. 阿里云建站之模板建站的核心优势有哪些?
  17. css 实现马赛克背景,ps透明背景,未选颜色的展示方式
  18. Linux学习之错误与解决记录(持续更新)
  19. 三磁环网络变压器圈比如何用LCR测量仪来检测?
  20. 将自定义的类的对像保存在本地

热门文章

  1. 《精通正则表达式(第三版)》下载
  2. 【全套完结】信号与线性系统分析--Matlab实验报告手册【建议保存】
  3. 怎么在自己电脑上搭建一个服务器,以便于外网访问呢?
  4. 操作系统学习笔记——北京大学陈向群老师课后及习题答案(5)
  5. 北大操作系统陈向群第七章知识点
  6. pop3工作原理和命令
  7. react项目中集成ckplayer播放器插件
  8. 图片转换工具类 base64、Uri转String
  9. QT中使用FFmpeg视频解码
  10. DELPHI编模拟鼠标,键盘操作,比键盘鼠标录制软件更强