在上个范例中,读者可以发现若你选择显示所有文件时,文件类型图标不会因扩展名的不同而有所区别,这样可能造成用户混淆 或是使用上的不方便.
要解决这个问题,你必须再实现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; } }