Java关于Image和ImageIcon的小阴谋

Java关于Image和ImageIcon的小阴谋

最近在做一个数字图像处理的作业,遇到一个难题。我要进行一个把原始图片转换为灰度图的操作,用按钮添加监听器,监听代码如下:

 //转换灰度控件 被观察者
        button_RGB2GRAY.addActionListener(new ActionListener(){

            @Override
            public synchronized void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                try {

                    pathOut = "C:\\Users\\Gigabyte\\Documents\\DIP\\gray.jpg";
                    //处理图像,在grayImage函数里,每次都把FileURL的图片处理后保存到pathOut里
                    rgbProcess.grayImage(FileURL);
                    tempIcon = new ImageIcon(pathOut);
                    pic_Label.setIcon(tempIcon);                
                    button_RGB2GRAY.setEnabled(false);                  

                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                validate();
            }

        });

这里写图片描述
这是打开一个图片的效果

这里写图片描述
点击第二个按钮后的效果

这里写图片描述

打开第二张图片的效果

这里写图片描述

第二张图片后的效果
这里写图片描述

这里出现了个bug就是无法显示我第二张修改后的图片,但是我查看本地文件夹的时候,发现图片确实是修改过了,并且把第一次修改的结果也覆盖了

之后无论我修改多少个其他文件,本地文件都会随时更新,但是我显示在面板上Label里的图片始终还是第一次的。

在网上找了很多都没找到原因,怀疑是图片缓存搞的鬼。咨询了之前教JAVA的老师,得到解决。

Java Image和ImageIcon不知道使用了什么缓存机制。必须要调用image.flush()才能重新装入图片文件。
因此要先由ImageIcon得到Image对象,再调用Iamge的flash()方法,再把ImageIcon对象用setImage()方法设成flush后的Image。

修改后的代码如下:

 //转换灰度控件 被观察者
        button_RGB2GRAY.addActionListener(new ActionListener(){

            @Override
            public synchronized void actionPerformed(ActionEvent e) {
                // TODO Auto-generated method stub
                try {
                    pathOut = "C:\\Users\\Gigabyte\\Documents\\DIP\\gray.jpg";
                    //处理图像
                    rgbProcess.grayImage(FileURL);
                    tempIcon = new ImageIcon(pathOut);
                    tempIMG = tempIcon.getImage();
                      tempIMG.flush();
                      tempIcon.setImage(tempIMG);
                    pic_Label.setIcon(tempIcon);                
                    button_RGB2GRAY.setEnabled(false);                  

                } catch (Exception e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }
                validate();
            }

        });
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值