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();
}
});