【问题标题】:Need FileDialog with a file type filter in Java在 Java 中需要带有文件类型过滤器的 FileDialog
【发布时间】:2009-08-06 22:56:05
【问题描述】:

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

感谢任何和所有的帮助。

【问题讨论】:

    标签: java swing awt filedialog


    【解决方案1】:

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

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

    Swing 的JFileChooser 将让您随心所欲。创建FileFilter 的子类并在JFileChooser 上调用setFileFilter

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

    【讨论】:

    • 这对我来说是正确的答案,我什至最终想出了如何设置 JFileChooser 的样式以匹配应用程序的其余部分。显然,这对于 FileDialog 是不可能的......这仍然让我感到难过。
    • 没有冒犯,但是 Mac OS X 上的 JFileChooser 看起来很丑,你会感到羞愧。
    • @Zizouz212 我不认为羞耻是正确的情绪。 Swing(开箱即用)在任何地方(包括 JFileChooser 和所有其他小部件)看起来都不是很好,尽管 Mac 可能是最不坏的。 SWT 更好,但更多(开发人员)工作。目前尚不清楚 OP 使用的是什么平台,但我认为我的回答已经暗示了所有这些。
    【解决方案2】:

    既然你使用的是JDialog,那是一个swing类为什么不使用JFileChooser

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

    FileNameExtensionFilter 是一个不错的 Java 6 类,它完全可以满足您的需求。

    【讨论】:

    • 我使用 FileDialog 的原因是它与 Windows 的外观和感觉完美匹配,并且与我们应用程序中的其他对话框保持一致。我可以制作一个匹配的 JFileChooser 吗?
    【解决方案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);
    

    【讨论】:

      【解决方案4】:

      如果您曾经使用过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】:

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

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

        获取源代码和二进制文件

        Xfiledialog project on google code

        【讨论】:

          【解决方案6】:

          只需使用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");
                                          }
                                      });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-06-15
            • 1970-01-01
            • 2021-10-06
            • 2017-04-04
            • 2017-07-18
            • 2017-08-28
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多