在上个范例中,读者可以发现若你选择显示所有文件时,文件类型图标不会因扩展名的不同而有所区别,这样可能造成用户混淆 或是使用上的不方便.
要解决这个问题,你必须再实现FileView这个抽象类,此抽象类定义了5个空的方法,如下表所示:
当你实现好这5个方法后,就可以利用JFileChooser的setFileView()方法来设置文件类型图标.我们来看下面的范例:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.filechooser.*;
public class FileIconFilterDemo implements ActionListener {
JFrame f = null;
JLabel label = null;
JFileChooser fileChooser = null;
public FileIconFilterDemo() {
f = new JFrame("FileIconFilter Demo");
Container contentPane = f.getContentPane();
JButton b = new JButton("打开文件");
b.addActionListener(this);
label = new JLabel(" ", JLabel.CENTER);
label.setPreferredSize(new Dimension(150, 30));
contentPane.add(label, BorderLayout.CENTER);
contentPane.add(b, BorderLayout.SOUTH);
f.pack();
f.setVisible(true);
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
new FileIconFilterDemo();
}
public void actionPerformed(ActionEvent e) {
fileChooser = new JFileChooser("c:\\winnt");
fileChooser.addChoosableFileFilter(new JAVAFileFilter("class"));
fileChooser.addChoosableFileFilter(new JAVAFileFilter("java"));
fileChooser.setFileView(new FileIcon());
int result = fileChooser.showOpenDialog(f);
if (result == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
label.setText("您选择了:" + file.getName() + "文件");
} else if (result == fileChooser.CANCEL_OPTION) {
label.setText("您没有选择任何文件");
}
}
}
class JAVAFileFilter extends FileFilter {
String ext;
public JAVAFileFilter(String ext) {
this.ext = ext;
}
public boolean accept(File file) {
if (file.isDirectory())
return true;
String fileName = file.getName();
int index = fileName.lastIndexOf('.');
if (index > 0 && index < fileName.length() - 1) {
String extension = fileName.substring(index + 1).toLowerCase();
if (extension.equals(ext))
return true;
}
return false;
}
public String getDescription() {
if (ext.equals("java"))
return "JAVA Source File (*.java)";
if (ext.equals("class"))
return "JAVA Class File (*.class)";
return "";
}
}
class FileIcon extends FileView {
public String getName(File f) {
return null; // 返回值为null的话,java look and feel功能会处理掉这个项目,并取得相关值来加以设置.
// 一般而言可以使用f.getName()当返回值.
}
public String getDescription(File f) {
return null; // 返回值为null的话,java look and feel功能会处理掉这个项目,并取得相关值来加以设置.
// 你也可以自己设置对此图片的描素,如这是一张风景图片等等.
}
public String getTypeDescription(File f) {
String extension = getExtensionName(f);
if (extension.equals("java"))
return "JAVA Source File";
if (extension.equals("class"))
return "JAVA Class File";
return "";
}
public Icon getIcon(File f) {
String extension = getExtensionName(f);
if (extension.equals("java"))
return new ImageIcon("java.gif");
if (extension.equals("class"))
return new ImageIcon("class.gif");
return null;
}
public Boolean isTraversable(File f) {
return null; // 返回值为null的话,java look and feel功能会处理掉这个项目,并取得相关值来加以设置.
// 若佻不希望某个目录被浏览,则返回值可以设为Boolean.FALSE.
}
public String getExtensionName(File f)// 在FileIcon类中我们增加一个getExtensionName()方法,用来返回文件的扩展名
{ // 名称.
String extension = "";
String fileName = f.getName();
int index = fileName.lastIndexOf('.');
if (index > 0 && index < fileName.length() - 1) {
extension = fileName.substring(index + 1).toLowerCase();
}
return extension;
}
}