2009-08-06 125 views
4

我有一个带有用户选择文件的按钮/文本框的JDialog。这里的代码:需要FileDialog和Java中的文件类型过滤器

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)”,但我不知道该怎么做。

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

回答

5

这些天AWT并不是真正的Java GUI应用程序的首选方式。太阳似乎主要放弃它。两种最受欢迎​​的选项是Swing和SWT。所以我认为他们没有非常广泛地开发API来添加现代功能。 (错了,回答你的问题:不,你似乎没有能够做到与AWT)

摇摆的优势在于它是真正的一次编写随处运行,它可以长得一模一样无处不在。有看起来&感觉试图使Swing看起来原生,有些比其他人好(Mac不是糟糕的,Windows是好的,GTK不是)。尽管如此,如果你想要一个真正看起来和应用程序完全相同的应用程序,Swing会让你做到这一点。另外,它不需要任何额外的库即可使用。性能不是很好。

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

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

+0

事实证明,这对我来说是正确的答案,我甚至最终想通了如何风格JFileChooser,以其余匹配应用程序。显然,这只是不可能与FileDialog ...这仍然让我伤心。 – Morinar 2009-08-12 15:14:24

+0

没有冒犯,但Mac OS X上的JFileChooser看起来很丑,你感到羞愧。 – Zizouz212 2015-06-27 00:34:02

+0

@ Zizouz212我不认为羞耻是正确的情感。 Swing(开箱即用)在任何地方都不是很好(JFileChooser和其他所有小部件),尽管Mac可能是最不好的。 SWT更好,但更多(开发人员)工作。目前还不清楚OP使用的是哪个平台,但我认为所有这些都已经被我的答案暗示了。 – 2015-06-28 01:26:20

5

因为您使用的是JDialog,那是一个秋千班,为什么不使用JFileChooser

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

FileNameExtensionFilter是一个不错的Java 6类,它完全符合你的要求。

+3

我使用FileDialog的原因是它完全符合Windows的外观和感觉,并且与我们应用程序中的其他对话框一致。我可以制作一个匹配的JFileChooser吗? – Morinar 2009-08-07 15:04:18

2

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

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

Xfiledialog project on google code

3

我也尝试这样做,得到的源代码和二进制。我想使用FileDialog而不是JFileChooser。

我找到了答案在这里: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); 
1

如果你曾经使用JavaFX 2中, FileChooser类将做的正是你所需要的,没有任何的JFileChooser中/ FileDialog的问题,您还可以嵌入JavaFX的Swing应用程序内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); 
0

只需使用FileDialog实例fdsetFilenameFilter方法:

  fd.setFilenameFilter(new FilenameFilter() 
          { 
           @Override 
           public boolean accept(File file, String s) 
           { 
            // enter code to return TRUE or FALSE here 
            return s.contains(".txt"); 
           } 
          });