4

我有一个带有按钮/文本字段的 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)”,但我不知道该怎么做。

任何和所有的帮助表示赞赏。

4

6 回答 6

6

如今,AWT 并不是编写 Java GUI 应用程序的首选方式。Sun 似乎基本上已经放弃了它。两个最受欢迎的选项是 Swing 和SWT。所以我认为他们并没有真正广泛地开发 API 来添加现代功能。(错误,回答您的问题:不,您似乎无法使用 AWT 做到这一点)

Swing 的优点是它真正是一次编写,随处运行,并且在任何地方看起来都完全相同。有一些 Look & Feels 试图让 Swing 看起来像原生的,有些比其他更好(Mac 并不糟糕,Windows 还可以,GTK 不是)。尽管如此,如果您想要一款在任何地方看起来和行为都完全相同的应用程序,Swing 会让您做到这一点。此外,它开箱即用,无需任何额外的库。性能不是很好。

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

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

于 2009-08-06T23:00:40.173 回答
5

既然您使用的是 JDialog,那是一个摇摆类,为什么不使用JFileChooser呢?

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

FileNameExtensionFilter是一个很好的 Java 6 类,它完全符合您的要求。

于 2009-08-06T23:06:44.217 回答
4

我也在尝试这样做。我想使用 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);
于 2012-10-03T22:22:00.813 回答
3

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

例子:

    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);
于 2012-11-30T01:43:06.570 回答
2

您可以使用 JNI 调用本机 Windows 文件对话框 (CFileDialog)。可以轻松地为 CFileDialog 设置过滤器。

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

谷歌代码上的 Xfiledialog 项目

于 2010-01-14T03:10:37.093 回答
0

只需使用实例setFilenameFilter的方法:FileDialogfd

            fd.setFilenameFilter(new FilenameFilter()
                            {
                                @Override
                                public boolean accept(File file, String s)
                                {
                                    // enter code to return TRUE or FALSE here
                                    return s.contains(".txt");
                                }
                            });
于 2017-10-06T14:14:49.573 回答