需要 Java 中带有文件类型过滤器的 FileDialog
-
12-09-2019 - |
题
我有一个带有按钮/文本字段的 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)”,但我不知道该怎么做。
感谢任何和所有的帮助。
解决方案
AWT是不是真的编写Java GUI应用这些天的首选方式。太阳也大多放弃了。两种最流行的选择是Swing和 SWT 。因此,我认为他们并没有真正开发的API非常广泛添加现代功能。 (错了,回答你的问题:不,你似乎没有能够做到与AWT)
秋千的优势在于它是真正的一次编写随处运行,它可以长得一模一样无处不在。还有的外观和感觉,尝试让Swing外观本地的,有些是比别人做得更好键(Mac并不可怕时,Windows是好,GTK不是)。不过,如果你想要一个应用程序,真正的外观和行为EXACTLY到处都一样,摇摆会让你做到这一点。再加上它运行外的开箱,没有任何额外的库。性能不是很大。
Swing的的JFileChooser 会让你做你想做的。创建 的FileFilter的子类并且呼吁setFileFilter
JFileChooser
。
SWT取一次写入随处运行相反的极端。你还有你写对一个代码库,但它实际上使用本机小部件每个平台上,因此它通常看起来像一个本机应用程序(不完美随处可见,但仍令人印象深刻)。它的快速和以我的经验相当可靠。月食(和其他高配置文件软件)使用SWT因此它在相当大量使用。但它确实需要特定于平台的JAR文件和DLL。
其他提示
由于您使用的JDialog,这是一个Swing类,为什么不使用的 JFileChooser中?
JFileChooser fc = new JFileChooser("C:\\");
fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));
的FileNameExtensionFilter 是一个很好的Java 6分中的类,它正是你想要的。
我也想这样做。我想使用代替的JFileChooser FileDialog的。
我找到了答案在这里: http://www.rgagnon.com/javadetails/ java的0247.html
他说:“这场胜利平台,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);
您可以调用本地Windows的FileDialog(CFileDialog的)使用JNI。过滤器可以很容易的CFileDialog设置。
我几个月前写了的CFileDialog一个简单的包装类,如果你有兴趣,你可以从
的源代码和二进制对谷歌代码 Xfiledialog项目
如果你曾经使用过 JavaFX 2, , 这 文件选择器 类将完全满足您的需要,而不会出现任何 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);
只要使用setFilenameFilter
实例FileDialog
的fd
方法:
fd.setFilenameFilter(new FilenameFilter()
{
@Override
public boolean accept(File file, String s)
{
// enter code to return TRUE or FALSE here
return s.contains(".txt");
}
});