一个使用javafx编写电子相片管理程序
一个使用javafx编写电子相片管理程序
项目源代码在gitbub上,请点击这里
前言:随着数码相机的普及,越来越多的人拥有大量的数字像片。本程序的目的是编写一个能够对数字像片进行管理和查看的应用程序。
图片管理器可作为计算机使用者浏览各种格式图片的载体而存在,作为人们日使用计算机工作的一大可视化工具。随着手机的日益普及,个人相片的数量呈现指数级增长。因此,一款出色的图片管理程序便显得尤为必要。
• 图片选择功能(包括单张和多张图片的选择,选中方式有两种:鼠标框中和ctrl+鼠标右键)
• 图片重命名功能(多选状态下,图片命名由“用户命名”+递增的序号 组成)
• 多种风格的图片滤镜,共有六种滤镜(Original、Overlay、Sepiatone、Bloom、Mercury、Exclusion),并且支持灰度滑条和添加滤镜后导出。
开发工具:
①、IDE—eclipse oxygen 2018
MVC模式将交互式应用分成模型(Model)、视图(View)和控制器(Controller)三部分。
① 、模型是指从现实世界中挖掘出来的对象模型,是应用逻辑的反映。模型封装了数据和对数据的操作,是实际进行数据处理的计算的地方。
② 视图是应用和用户之间的接口,它负责将应用显现给用户和显示模型的状态。
③ 、控制器负责视图和模型之间的交互,控制对用户输入的响应响应方式和流程,它主要负责两方面的动作:把用户的请求分发到相应的模型;将模型的改变及时反应到视图上。
MVC将这些对象分离以提高灵活性和复用性。MVC模式的结构如下图所示:
本程序使用javaFX和SceneBuilder作为开发语言和界面设计工具,其天生便符合MVC开发模式。
• PictureFile模型对图片文件的数据产生和列表等操作进行了封装。
• PictureNode 模型通过扩展Label类,自定义了包含ImageView和Text的图片节点,内部封装了各种鼠标事件的监听器,是整个项目数据操作的主要来源。
• MyContextMenu 模型封装了整个项目的鼠标右击事件和数据操作处理
• TreeFile 模型为TreeView遍历系统目录树提供数据封装以及数据处理
② 、Controller:借助javaFX 及 Scenebuilder,我们通过.fxml文件进行界面设计,本处Controller均是基于.fxml文件自动生成。
• MainUIController:主界面的控制器,响应用户的鼠标操作,并将其呈现在视图上,例如用户的目录树点击操作、打开复制粘贴剪切删除重命名等操作。
• ViewUIController:图片查看界面的控制器,将用户的操作分发到ImageView模型上,并将模型的改变反应到视图上,提供人机交互。
③ 、View:使用Scenebuilder进行可视化人机交互界面设计。
④ 、action:为了提高项目的可读性和可重用更改性,将所有界面的Button的相应操作封装到一个包内。
本程序数据存储设计较为简单,仅使用了自定义的ArrayList 对象链表和image文件的读写,不涉及数据库等复杂数据存储设计。
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属性。这个属性就是指定事件处理的类。
3.1 程序框图
3.1.1 PictureNode 的 实现:
3.1.2 MainUIController右边flowPane中PictureNode被框选时的高亮状态:
一个使用javafx编写电子相片管理程序相关推荐
- everest命令_认识Everest:一个用JavaFX编写的漂亮的REST API测试客户端
everest命令 今天,我们正在探索即将用JavaFX编写的REST API测试客户端. 认识Everest ,以前称为RESTaurant. 珠穆朗玛峰(Everest)依靠的是资源,React灵 ...
- idea 编写javafx_用JavaFX编写图块引擎
idea 编写javafx 随着JavaFX嵌入式版本的问世,我们的框架对于游戏开发变得越来越有趣,因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备. 因此,我决定对JavaFX进行更多的游戏编 ...
- 用JavaFX编写图块引擎
随着JavaFX嵌入式版本的问世,我们的框架对于游戏开发变得越来越有趣,因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备. 因此,我决定对JavaFX进行更多的游戏编写实验. 这次,我想使用Ca ...
- javafx 教程_用JavaFX编写图块引擎
javafx 教程 随着JavaFX嵌入式版本的问世,我们的框架对于游戏开发变得越来越有趣,因为我们现在可以瞄准平板电脑和智能手机等小型消费类设备. 因此,我决定对JavaFX进行更多的游戏编写实验. ...
- Java黑皮书课后题第8章:*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1。让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了
*8.23(游戏:找到翻转的单元格)假定给定一个填满0和1的6*6矩阵,所有的行和列都有偶数个1.让用户翻转一个单元,编写一个程序找到哪个单元格被翻转了 题目 题目描述与运行示例 破题 代码 题目 题 ...
- Java黑皮书课后题第6章:**6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数。编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开
6.27(反素数)反素数(反转拼写的素数)是指一个非回文素数,将其反转之后也是一个素数.编写程序,显示前100个反素数,每行显示10个,并且数字间用空格隔开 题目 题目描述 破题 代码 题目 题目描述 ...
- Java黑皮书课后题第5章:*5.46(倒排一个字符串)编写一个程序,提示用户输入一个字符串,然后以反序显示该字符串
5.46(倒排一个字符串)编写一个程序,提示用户输入一个字符串,然后以反序显示该字符串 题目 题目概述 破题 运行示例 代码 题目 题目概述 5.46(倒排一个字符串)编写一个程序,提示用户输入一个字 ...
- Java黑皮书课后题第3章:**3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形。编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内
**3.27(几何:点是否在三角形内)假设一个平面上有一个直角三角形.编写程序,提示用户输入一个点的x坐标和y坐标,然后判断这个点是否在该三角形内 题目 题目描述 破题 运行示例 代码 题目 题目描述 ...
- 数据结构--二叉树--路径 假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结
假设二叉树采用二叉链表方式存储, root指向根结点,node 指向二叉树中的一个结点, 编写函数 path,计算root到 node 之间的路径,(该路径包括root结点和 node 结点).pat ...
最新文章
- python使用textwrap包在已经生成的长字符串中嵌入回车符实战
- php扇形分布图,PHP制作3D扇形统计图以及对图片进行缩放操作实例
- 趣谈Linux操作系统学习笔记:用户态内存映射:如何找到正确的会议室?(第25讲)...
- 专业人士提升数据中心职业生涯的6件事
- python报错 TypeError: an integer is required
- java计算二叉树的节点最小值_java计算二叉树的高度以及叶节点个数
- SharePoint【调试,诊错系列】-- 开发环境中不同调试对象的Attach方式
- jmeter聚合报告如何添加单位_JMeter聚合报告(Aggregate Report)理解
- mysql如何获取句柄_关于获取进程句柄的问题
- honeywell新风系统控制面板说明_新风系统——不开窗也能清新呼吸
- java 进度条 不更新_java进度条不动怎么解决?
- 项目管理的五个过程和九大知识领域
- IIS7管理器设置网站首页
- python中的单引号和双引号有什么区别_python中双引号和单引号的区别是什么
- mysql防止商品超卖_避免商品超卖的4种方案
- 阿里云建站之模板建站的核心优势有哪些?
- css 实现马赛克背景,ps透明背景,未选颜色的展示方式
- Linux学习之错误与解决记录(持续更新)
- 三磁环网络变压器圈比如何用LCR测量仪来检测?
- 将自定义的类的对像保存在本地