需要FileDialog和Java中的文件类型filter
我有一个带有按钮/文本字段的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();
我的问题是,我没有看到所有文件filter,而是想提供自定义filter,例如Word文档或其他东西。 我使用setFilenameFilter()设置了一个自定义的FilenameFilter,但它似乎不起作用。 我注意到它在文档中说自定义filter在Windows中不起作用(这在Windows XP / Vista / 7中运行)。 这是我对filter的实现:
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以增加现代function。 (呃,回答你的问题:不,你似乎无法用AWT做到这一点)
Swing的优势在于它可以在任何地方进行真正的一次写入操作,并且在任何地方都可以看起来完全相同。 有看起来和感觉试图让Swing看起来像原生,有些比其他更好(Mac并不可怕,Windows是好的,GTK不是)。 尽管如此,如果你想要一个真正看起来和行为完全相同的应用程序,Swing会让你这样做。 此外,它开箱即用,没有任何额外的库。 表现不是很好。
Swing的JFileChooser会让你做你想做的事。 创建FileFilter的子类并在JFileChooser
上调用setFileFilter
。
SWT将写入一次运行的任何地方都带到了相反的极端。 你仍然有一个你编写的代码库,但它实际上使用每个平台上的本机小部件,所以它通常看起来像一个本机应用程序(在任何地方都不完美,但仍然令人印象深刻)。 根据我的经验,这是快速和可靠的。 Eclipse(以及其他高端软件)使用SWT,因此它的使用非常繁重。 但它确实需要特定于平台的JAR和DLL。
既然你正在使用JDialog,那么为什么不使用JFileChooser呢?
JFileChooser fc = new JFileChooser("C:\\"); fc.setFileFilter(new FileNameExtensionFilter("Microsoft Word (*.doc, *.docx)", "doc", "docx"));
FileNameExtensionFilter是一个很好的Java 6类,可以完全满足您的需求。
我也试图这样做。 我想使用FileDialog而不是JFileChooser。
我在这里找到答案: http : //www.rgagnon.com/javadetails/java-0247.html
他说“在Win平台上,setFilenameFilter方法不起作用。我们必须使用setFile方法来设置filter。”
指定链接上有源代码。
我测试了它的工作原理:
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);
您可以使用JNI调用本机Windows Filedialog(CFileDialog)。 可以轻松地为CFileDialog设置filter。
几个月前我为CFileDialog写了一个简单的包装类,如果你有兴趣,你可以从中获取源代码和二进制文件
谷歌代码上的Xfiledialog项目
如果您曾经使用过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);
只需使用FileDialog
实例fd
setFilenameFilter
方法:
fd.setFilenameFilter(new FilenameFilter() { @Override public boolean accept(File file, String s) { // enter code to return TRUE or FALSE here return s.contains(".txt"); } });