File f = (File) event.getNewValue();event.getNewValue()得到的是一个ImagePreviewer,强制转换为File,肯定会有问题啊
首先,你这不叫编译错误,叫运行时错误 错误的原因在于public void propertyChange(PropertyChangeEvent event) { if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY); { // the user has selected a new file File f = (File) event.getNewValue(); //这里报错 这里if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY);后面多了个分号,其余的不用多说了吧
因为很多地方都会导致propertyChange事件发生,不一定每次发生都是因为选择了文件,比如你调用 chooser.setFileFilter(filter); chooser.setAccessory(new ImagePreviewer(chooser)); chooser.setFileView(new FileIconView(filter, new ImageIcon("palette.gif"))); 这些都会导致chooser的属性发生改变而发生事件,所以你修改一下你的事件里的代码,判断一下属性改变的是否是文件,是再继续强行转换,就可以了,比如 public ImagePreviewer(JFileChooser chooser) { setPreferredSize(new Dimension(100, 100)); setBorder(BorderFactory.createEtchedBorder());
chooser.addPropertyChangeListener(new PropertyChangeListener() { public void propertyChange(PropertyChangeEvent event) { if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY); { // the user has selected a new file if (event.getNewValue() instanceof File) { //追加一个判断 File f = (File) event.getNewValue(); //这里报错 if(f == null) { setIcon(null); return; }
// read the image into an icon ImageIcon icon = new ImageIcon(f.getPath());
// if the icon is too large to fit ,scale it if(icon.getIconWidth() > getWidth()) icon = new ImageIcon(icon.getImage().getScaledInstance(getWidth(), -1, Image.SCALE_DEFAULT)); setIcon(icon); } } } }); }
event.getNewValue()返回一个object,而且这个是chooser的事件,为啥会运行时变成ImagePreviewer 的对象了
下
错误的原因在于public void propertyChange(PropertyChangeEvent event)
{
if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY);
{
// the user has selected a new file
File f = (File) event.getNewValue(); //这里报错
这里if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY);后面多了个分号,其余的不用多说了吧
chooser.setFileFilter(filter);
chooser.setAccessory(new ImagePreviewer(chooser));
chooser.setFileView(new FileIconView(filter, new ImageIcon("palette.gif")));
这些都会导致chooser的属性发生改变而发生事件,所以你修改一下你的事件里的代码,判断一下属性改变的是否是文件,是再继续强行转换,就可以了,比如 public ImagePreviewer(JFileChooser chooser)
{
setPreferredSize(new Dimension(100, 100));
setBorder(BorderFactory.createEtchedBorder());
chooser.addPropertyChangeListener(new PropertyChangeListener()
{
public void propertyChange(PropertyChangeEvent event)
{
if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY);
{
// the user has selected a new file
if (event.getNewValue() instanceof File) { //追加一个判断
File f = (File) event.getNewValue(); //这里报错
if(f == null)
{
setIcon(null);
return;
}
// read the image into an icon
ImageIcon icon = new ImageIcon(f.getPath());
// if the icon is too large to fit ,scale it
if(icon.getIconWidth() > getWidth())
icon = new ImageIcon(icon.getImage().getScaledInstance(getWidth(), -1, Image.SCALE_DEFAULT));
setIcon(icon);
}
}
}
});
}
if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY);
这个本身就是对选择文件造成propertyg改变发生事件作的判断,只是因为后面多了个; 所以if相当于后面接的是空代码,然后后面的{}内的代买相当无条件执行。
是不是说下面这段代码
FileNameExtensionFilter filter = new FileNameExtensionFilter("Image files", "jpg", "jpeg", "gif");Java1.5不支持 ?