当前位置: 首页 > news >正文

JavaFX 图片查看器:从文件选择到图片展示

JavaFX 图片查看器:从文件选择到图片展示

上一篇我们解决了 JavaFX-MediaPlayer 参数URI格式问题,今天继续探索 JavaFX 的实用功能——图片查看器。我们将实现一个支持本地文件选择、图片预览、缩放拖拽的完整示例。


一、最终效果预览

运行程序后,点击「打开文件」按钮选择图片,即可在窗口中展示:

上图展示了程序主界面:标题栏显示「文件选择器」,包含一个「打开文件」按钮,下方展示选中的图片。


二、完整代码

importjavafx.application.Application;importjavafx.geometry.Insets;importjavafx.geometry.Pos;importjavafx.scene.Scene;importjavafx.scene.control.Button;importjavafx.scene.image.Image;importjavafx.scene.image.ImageView;importjavafx.scene.layout.BorderPane;importjavafx.scene.layout.HBox;importjavafx.stage.FileChooser;importjavafx.stage.Stage;importjava.io.File;publicclassImageViewerextendsApplication{privateImageViewimageView;@Overridepublicvoidstart(StageprimaryStage){// 1. 创建根布局BorderPaneroot=newBorderPane();root.setPadding(newInsets(10));// 2. 创建图片展示区域imageView=newImageView();imageView.setPreserveRatio(true);// 保持宽高比imageView.setFitWidth(800);// 默认适应宽度imageView.setFitHeight(600);// 默认适应高度root.setCenter(imageView);// 3. 创建顶部工具栏HBoxtopBar=newHBox(10);topBar.setAlignment(Pos.CENTER_LEFT);topBar.setPadding(newInsets(0,0,10,0));ButtonopenBtn=newButton("打开文件");openBtn.setOnAction(e->openImage(primaryStage));topBar.getChildren().add(openBtn);root.setTop(topBar);// 4. 创建场景并展示Scenescene=newScene(root,900,700);primaryStage.setTitle("文件选择器");primaryStage.setScene(scene);primaryStage.show();}/** * 打开文件选择器并加载图片 */privatevoidopenImage(Stagestage){FileChooserfileChooser=newFileChooser();fileChooser.setTitle("选择图片文件");// 设置文件过滤器,只允许图片格式fileChooser.getExtensionFilters().addAll(newFileChooser.ExtensionFilter("图片文件","*.png","*.jpg","*.jpeg","*.gif","*.bmp"),newFileChooser.ExtensionFilter("所有文件","*.*"));Filefile=fileChooser.showOpenDialog(stage);if(file!=null){// 使用 file.toURI() 获取正确的 URI 格式// 这与上一篇 MediaPlayer 的 URI 处理思路一致Imageimage=newImage(file.toURI().toString());imageView.setImage(image);}}publicstaticvoidmain(String[]args){launch(args);}}

三、核心知识点解析

3.1 FileChooser 文件选择器

JavaFX 提供了FileChooser类来创建原生风格的文件选择对话框:

方法说明
setTitle(String)设置对话框标题
setInitialDirectory(File)设置默认打开目录
getExtensionFilters()添加文件类型过滤器
showOpenDialog(Stage)显示打开文件对话框

3.2 图片 URI 的正确处理

上一篇我们解决了 MediaPlayer 的 URI 格式问题,图片加载同样需要正确处理:

// ❌ 错误:直接使用文件路径Imageimage=newImage("D:\图片\test.png");// 会报错!// ✅ 正确:使用 File.toURI()Imageimage=newImage(file.toURI().toString());// file:///D:/图片/test.png

核心原则:JavaFX 的ImageMedia类都需要标准 URI 格式,Windows 路径中的反斜杠和中文都会导致解析失败。

3.3 ImageView 常用属性

imageView.setPreserveRatio(true);// 保持原始宽高比imageView.setFitWidth(800);// 限制最大宽度imageView.setFitHeight(600);// 限制最大高度imageView.setSmooth(true);// 启用平滑缩放imageView.setCache(true);// 启用缓存提升性能

四、运行效果截图

4.1 选择图片文件

弹出系统原生的文件选择对话框,已过滤为图片格式。

4.2 图片展示效果

选中的图片自适应窗口大小展示,保持原始比例不变形。


五、进阶:添加缩放和拖拽功能

如果想实现类似图片浏览器的缩放拖拽效果,可以添加以下代码:

// 在 start() 方法中,创建 imageView 后添加:// 鼠标滚轮缩放imageView.setOnScroll(e->{doubledelta=e.getDeltaY();doublescale=imageView.getScaleX();if(delta>0){scale*=1.1;// 放大}else{scale*=0.9;// 缩小}// 限制缩放范围scale=Math.max(0.1,Math.min(scale,5.0));imageView.setScaleX(scale);imageView.setScaleY(scale);});// 鼠标拖拽平移finaldouble[]dragDelta=newdouble[2];imageView.setOnMousePressed(e->{dragDelta[0]=imageView.getTranslateX()-e.getSceneX();dragDelta[1]=imageView.getTranslateY()-e.getSceneY();});imageView.setOnMouseDragged(e->{imageView.setTranslateX(e.getSceneX()+dragDelta[0]);imageView.setTranslateY(e.getSceneY()+dragDelta[1]);});

六、总结

知识点要点
FileChooser使用showOpenDialog()弹出文件选择器
文件过滤通过ExtensionFilter限制可选文件类型
URI 转换始终使用file.toURI().toString()获取正确路径
ImageViewsetPreserveRatio(true)保持图片比例
http://www.zskr.cn/news/1508943.html

相关文章:

  • JQPlay部署指南:Docker容器化与生产环境配置详解
  • 3步掌握ArchivePasswordTestTool:从加密压缩包到密码恢复的完整实战指南
  • Optuna与Scikit-learn结合:OptunaSearchCV实现高效网格搜索的完整指南
  • COMSOL钒电池三维仿真四合一包:蛇形/交指流道、等温非等温、瞬态浓度演化与二维动态充放电建模
  • 多维聚合实战:Pandas与SQL的交叉分析心法
  • ArduPilot无人机飞控系统:专业级硬件设计与抗干扰完全指南
  • 3秒搞定网页图片格式转换:Save Image as Type扩展的完整指南
  • 2026年优质的东光创宏机械生厂商推荐 - mypinpai
  • 别只盯着Mode0/3了!深入SPI Nor Flash时序,聊聊时钟边沿与采样延时的那些坑
  • 从RS232接口看EMC设计:一个老标准教给我们的硬件防护思路
  • 从显示器时序到FPGA代码:彻底搞懂HDMI 720P@60Hz彩条显示的完整流程
  • 神经音频编解码器中的形状-增益分解技术解析
  • 保姆级拆解:LTPI协议如何用CPLD和LVDS搞定服务器远程I/O扩展?
  • WPF图像操作报GDI+通用错误?附带即用型修复工程(含XAML/CS完整源码)
  • 别再让浮点运算拖慢你的嵌入式程序了!手把手教你配置GCC的-mfloat-abi和-mfpu选项
  • 深度解析Windows Defender控制工具:开源defender-control实战指南
  • 3分钟解决Windows VC运行库问题:VisualCppRedist AIO全合一安装包完整指南
  • Windows 11 LTSC版完整恢复微软商店功能:企业级部署与技术深度解析
  • what-anime-cli性能优化:提升动漫识别速度的7个技巧
  • ADF4351射频信号源电路设计:从原理图到PCB的实战避坑指南
  • 北京研学机构哪家好?高性价比的青少年独立北京研学机构推荐 - 品牌2026
  • 别再只写getter/setter了!用Q_PROPERTY让你的Qt对象属性管理更优雅(附完整代码示例)
  • 别再混淆了!一文讲清自相关(APSD)与互相关(CPSD)功率谱密度的区别与应用场景
  • 别再死记硬背了!用Wireshark抓包实战,5分钟搞懂USB描述符的‘自报家门’流程
  • 从Notebook到生产:机器学习模型服务化实战指南
  • 聊聊发泡混凝土自流平的价格及靠谱厂家 - myqiye
  • 2026年新型轨道电动平车市场格局分析:技术路线、应用案例与供应商综合评估 - 优质品牌商家
  • 2026年6月1-6年级优质的提分卷怎么选,同步测试卷/名著导读测试卷/教辅/期中抢分卷/重点名校卷,提分卷口碑推荐 - 品牌推荐师
  • AWS机器学习API部署:SageMaker+Lambda+API Gateway生产实践
  • 思源宋体CN:开源中文字体如何解决你的7大设计痛点