2007年9月20日星期四

Get the file type icon with Java


我们的项目产生各种报表, 其中一个功能是能将报表生成各种文件格式, 如Excel, Word, PDF, Html 和TXT文件。 我们弹出一个Dialog来让客户选择直接打开, 还是通过一个File Chooser来选择保存的文件名和路径, 保存在客户的机子上。客户抱怨说如果硬盘已经存在同名的文件。 没有任何提示就覆盖掉源文件。今天做的一个改进是检查是否已经存在同名文件, 如果有的话就弹出一个“Confirm File Ovewrite”的Dialog, 让客户选择是否覆盖。Looks like this one.

首先根据文件名来生成 File 对象。然后根据file.Exists() 来判断是否已经存在该文件。

File file = new File(filePath);
if( file.exists())
{
// 显示Dialog, 并根据客户的选择做相应的处理, 代码省略。
}

参照微软的样板, 显示文件名, 文件大小, 和文件最后修改时间等等。 其中重点是根据文件的类型显示出一个Icon(32x32)。 当然我们可以根据文件的后缀来加载相应的Icon, 但是一来拓展性差, 二来象Html文件, 在IE是省缺浏览器时显示IE的图标, FireFox是省缺浏览器时显示FireFox图标就做不到了。

最简单的方法是从系统取相应的图标。 代码如下:
import sun.awt.shell;

Public Icon getIconByFileType( File file )
{
try
{
ShellFolder shellFolder = ShellFolder.getShellFolder(file);
return shellFolder.getIcon(true);
}
catch (Exception e)
{
// do something
return null;
}
}

此方法仅适用于运行Sun JVM 的平台。在WinXP下java 1.6 下测试通过。

那么还有另外一种方法适合各种平台,但是只能取小图标(16x16)。
Public Icon getIconByFileType( File file )
{
try
{
FileSystemView view = FileSystemView.getFileSystemView();
return view.getSystemIcon(file);
}
catch (Exception e)
{
// do something
return null;
}
}

一旦取得图标, 就可以通过JLabel的setIcon 方法来把图标显示出来。

没有评论: