当前位置: 首页 > 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.jsqmd.com/news/997172/

相关文章:

  • 2026年成都军事夏令营机构怎么选?实地走访与行业观察全解析 - 优质品牌商家
  • 2026南京智能家居企业做GEO应该怎么选服务商?本地靠谱GEO服务商选型全攻略 - 企业新闻快传
  • 青海植物纤维毯定价维度解析及合规厂家选型指南:西宁草种花种/西宁边坡植生袋/西宁边坡绿化植生袋/边坡绿化植生袋/选择指南 - 优质品牌商家
  • 区分核心能力:知识库智能体与传统AI客服的行业应用差异
  • .NET开发者可用的Microsoft Graph邮箱与日历操作实战代码包(含5种认证方式)
  • 3步掌握ArchivePasswordTestTool:从加密压缩包到密码恢复的完整实战指南
  • Optuna与Scikit-learn结合:OptunaSearchCV实现高效网格搜索的完整指南
  • 手把手教你理解5G LAN:从‘手机不能互搜’到‘车间设备秒组网’的技术跃迁
  • 混凝土汽车衡技术选型指南:100吨地磅/120吨汽车衡/150吨地磅/150吨汽车衡/200吨汽车衡/3x18米汽车衡/选择指南 - 优质品牌商家
  • 2026年滑触线排名,哪家性价比高? - myqiye
  • 2026南京装修公司做GEO应该怎么选服务商?本地靠谱GEO服务商推荐与选型指南 - 企业新闻快传
  • COMSOL钒电池三维仿真四合一包:蛇形/交指流道、等温非等温、瞬态浓度演化与二维动态充放电建模
  • 2026年干雾抑尘设备选型指南:从技术路线到服务体系的综合评测与行业趋势分析 - 优质品牌商家
  • 多维聚合实战:Pandas与SQL的交叉分析心法
  • ArduPilot无人机飞控系统:专业级硬件设计与抗干扰完全指南
  • Docker容器化原理与生产落地全解析
  • 3秒搞定网页图片格式转换:Save Image as Type扩展的完整指南
  • 别再被运放‘零点漂移’坑了!实测OPA2188的失调电压与电流(附详细测量步骤)
  • 【一步到位】OpenClaw 2.7.9 Windows 部署 + 激活 + 使用 (含安装包)
  • 2026年优质的东光创宏机械生厂商推荐 - mypinpai
  • 从SPI Mode 0/3的时序图,看懂为什么高频必须加‘采样窗口’
  • 别只盯着Mode0/3了!深入SPI Nor Flash时序,聊聊时钟边沿与采样延时的那些坑
  • 3个步骤彻底解决Windows热键冲突:Hotkey Detective一键定位占用程序
  • 南京建材企业做GEO怎么选服务商?2026本地靠谱GEO服务商选型指南 - 企业新闻快传
  • 从RS232接口看EMC设计:一个老标准教给我们的硬件防护思路
  • 从显示器时序到FPGA代码:彻底搞懂HDMI 720P@60Hz彩条显示的完整流程
  • 神经音频编解码器中的形状-增益分解技术解析
  • 2026年经济实惠的湖南菜服务品牌排名,哪家好? - mypinpai
  • ethtool 4.5源码包:含30+网卡驱动适配的Linux以太网参数调试工具
  • cann/cannbot-skills TileLang算子开发指南