java - 在 java 中以编程方式删除图像文件后,ImageIcon 显示从路径中删除的文件
问题描述
我的项目正在加载一个 ImageIcon,它是从路径中删除的图像。
最初,我已将图像从文件路径加载到 ImageIcon,之后我从路径中删除了图像文件。再次,我尝试将图像从已删除的路径加载到 Same ImageIcon 对象,它显示已删除的图像。
File file = new File(Utility.generate_file_path("Ec_resized_image\\ansi.png"));
System.out.println(Utility.generate_file_path("Ec_resized_image\\ansi.png")
+ " : " + file.exists());
ImageIcon icon = new ImageIcon(Utility.generate_file_path("Ec_resized_image\\ansi.png"));
System.out.println("Width: " + icon.getIconWidth());//Here it the image width is showing 1920
file.delete(); //here I am deleting the file
System.out.println(Utility.generate_file_path("Ec_resized_image\\ansi.png") + " : " + file.exists()); // here file.exists() says false.
icon = new ImageIcon(Utility.generate_file_path("Ec_resized_image\\ansi.png")); // Again loading the deleted path
System.out.println("Width: " + icon.getIconWidth());////Here it the image width is showing again 1920
解决方案
ImageIcon(filename)
将图像的实际加载委托给Toolkit.getDefaultToolkit().getImage(filename)
(API 可能没有这样定义,但我在源代码中看到了这一点。)
来自的Javadoc Toolkit.getImage()
:
底层工具包尝试将具有相同文件名的多个请求解析为相同的返回图像。
...
如果指定文件中包含的图像数据发生更改,则从此方法返回的对象可能仍包含Image
在先前调用后从文件中加载的陈旧信息。
这个 javadoc 然后继续:
可以通过调用
flush()
返回的方法手动丢弃以前加载的图像数据Image
。
因此,正如 Mena 建议的那样,icon.getImage().flush()
应该做到这一点。
推荐阅读
- shell - 如何获取使用 Jenkinsfile (groovy)中的变量执行的 shell 脚本的输出?
- vue.js - 在 Vee-Validate 3.0 中使用 ValidationProvider 在某些情况下跳过验证
- python - 更改使用 matplotlib python 显示的箱线图“框”百分位数
- excel - 循环浏览文件夹中的子文件夹
- python - 简化“如果”条件
- nginx - 如何配置 nginx 以指向特定的域站点以提供内容?
- ruby-on-rails - Ruby on Rails 的 JoinTable 关系问题
- deployment - 为什么我不能将我的 repo 发布到 GitHub Pages?
- javascript - vuex 突变设置状态
- javascript - Problem converting function with promise from JS to TS