需要FileDialog和Java中的文件类型过滤器

时间:2009-08-06 22:56:06

标签: java swing awt filedialog

我有一个带有按钮/文本字段的JDialog供用户选择文件。这是代码:

FileDialog chooser = new FileDialog(this, "Save As", FileDialog.SAVE );
String startDir = saveAsField.getText().substring( 0, saveAsField.getText().lastIndexOf('\\') );
chooser.setDirectory(startDir);
chooser.setVisible(true);
String fileName = chooser.getFile();

我的问题是,我没有看到所有文件过滤器,而是想提供自定义过滤器,例如对于Word文档或其他东西。我使用setFilenameFilter()设置了一个自定义的FilenameFilter,但它似乎不起作用。我注意到它在文档中说自定义过滤器在Windows中不起作用(这在Windows XP / Vista / 7中运行)。这是我对过滤器的实现:

chooser.setFilenameFilter( new geFilter() );
public class geFilter implements FilenameFilter {
    public boolean accept(File dir, String name) {
        return name.endsWith( ".doc" ) || name.endsWith( ".docx" );
    }
}

我在这里做错了吗?此外,我想在框中显示一个描述,如“Microsoft Word(* .doc * .docx)”,但我不知道该怎么做。

感谢任何和所有帮助。

6 个答案:

答案 0 :(得分:5)

现在,AWT并不是编写Java GUI应用程序的首选方式。太阳似乎大多放弃了它。最受欢迎的两个选项是Swing和SWT。所以我认为他们并没有真正开发API以增加现代功能。 (呃,回答你的问题:不,你似乎无法用AWT做到这一点)

Swing的优势在于它可以在任何地方进行真正的一次写入操作,并且在任何地方都可以看起来完全相同。 Look&试图使Swing看起来很原生的感觉,有些比其他更好(Mac并不可怕,Windows可以,GTK不是)。尽管如此,如果你想要一个真正看起来和行为完全相同的应用,Swing会让你这样做。此外,它开箱即用,没有任何额外的库。表现不佳。

Swing的JFileChooser会让你做你想做的事。创建FileFilter的子类并在setFileFilter上调用JFileChooser

SWT将写入一次运行的任何地方带到相反的极端。你仍然有一个你编写的代码库,但它实际上使用每个平台上的本机小部件,所以它通常看起来像一个本机应用程序(在任何地方都不完美,但仍然令人印象深刻)。根据我的经验,这是快速和可靠的。 Eclipse(以及其他高端软件)使用SWT,因此它的使用非常繁重。但它确实需要特定于平台的JAR和DLL。

答案 1 :(得分:5)

既然您正在使用JDialog,那么为什么不使用JFileChooser呢?

 JFileChooser fc = new JFileChooser("C:\\");
 fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));

FileNameExtensionFilter是一个很好的Java 6类,可以完全按照你想要的那样完成。

答案 2 :(得分:3)

我也试图这样做。我想使用FileDialog而不是JFileChooser。

我在这里找到答案:http://www.rgagnon.com/javadetails/java-0247.html

他说“在Win平台上,setFilenameFilter方法不起作用。我们必须使用setFile方法来设置过滤器。”

指定链接上有源代码。

我测试了它的确有效:

FileDialog fd = new FileDialog((Frame) null, "Save File", FileDialog.SAVE);
fd.setFile("*.txt");
fd.setVisible(true);

String file = fd.getFile();
System.out.println(file);
System.exit(0);

答案 3 :(得分:2)

您可以使用JNI调用本机Windows Filedialog(CFileDialog)。可以轻松地为CFileDialog设置过滤器。

我几个月前为CFileDialog写了一个简单的包装类,如果你有兴趣,可以从

获取源代码和二进制文件。

Xfiledialog project on google code

答案 4 :(得分:1)

如果您使用JavaFX 2FileChooser类将完全满足您的需要,而不会出现任何JFileChooser / FileDialog问题。您还可以在Swing应用程序中嵌入JavaFX 2组件,但需要JavaFX runtime

示例:

    FileChooser fc = new FileChooser();
    FileChooser.ExtensionFilter filter;
    filter = new FileChooser.ExtensionFilter("Text files (*.txt)", "*.txt");
    fc.getExtensionFilters().add(filter);
    File f = fc.showOpenDialog(primaryStage);
    System.out.println(f);

答案 5 :(得分:0)

只需使用setFilenameFilter实例FileDialog的{​​{1}}方法:

fd