【问题标题】:How to filter file type in FileDialog?如何在 FileDialog 中过滤文件类型?
【发布时间】:2012-09-24 03:12:45
【问题描述】:

我正在使用 FileDialog 在 Java 程序中进行保存和加载。

如何过滤下拉列表以指定文件类型为“JPG”或“JPEG”等?

我试过下面的代码,但是好像没有效果。

还有其他方法吗?

public void actionPerformed(ActionEvent e) {
            FileDialog saveFileDialog = new FileDialog(new Frame(), "Save", FileDialog.SAVE);

            saveFileDialog.setFilenameFilter(new FilenameFilter(){
                @Override
                public boolean accept(File dir, String name) {
                    return name.endsWith(".jpg") || name.endsWith(".jpeg");
                }
            });
            saveFileDialog.setFile("Untitled.jpg");
            saveFileDialog.setVisible(true);
        }

【问题讨论】:

    标签: java filedialog


    【解决方案1】:

    答案很简单。你可以使用

     saveFileDialog.setFile("*.jpg;*.jpeg");
    

    无需使用setFilenameFilter 方法。您可以添加任意数量的文件类型。

    可以在 huxhornBug ID: 4031440 FileDialog doesn't call FilenameFilter.accept() 的评论中找到解决此问题的方法。

    public void actionPerformed(ActionEvent e) {
                FileDialog saveFileDialog = new FileDialog(new Frame(), "Save", FileDialog.SAVE);
                saveFileDialog.setFile("*.jpg;*.jpeg");
                saveFileDialog.setVisible(true);
            }
    

    【讨论】:

    • 似乎最多可以使用两种类型的字符串。尝试使用五个,选择后getFile会返回错误信息。
    • 根据 SO 帖子stackoverflow.com/questions/14972664,我抱怨的是 JDK 7 中的一个错误。
    【解决方案2】:

    这对我也不起作用。 Filename filters do not function in Sun's reference implementation for Microsoft Windows.

    相反,您可以尝试以下代码。您还应该删除 setFilenameFilter 部分:

    saveFileDialog.setFile("*.jpg");
    

    【讨论】:

    • 它只是设置文件的默认保存名称,但对下拉列表没有任何改变...
    • 是的,但它有效,因为它不允许您查看具有其他扩展名的文件。
    • 我想要的是有什么替代方法可以指定下拉列表的内容吗?
    • '文件名过滤器在 Sun 的 Microsoft Windows 参考实现中不起作用'。请看here
    【解决方案3】:

    我一直使用 JFileChooser 而不是 FileDialog。然后,您可以为您的程序将支持的各种类型添加多个 ChoosableFileFilters:

    File myFilename;
    chooser = new JFileChooser();
    chooser.addChoosableFileFilter(new OpenFileFilter("jpeg","Photo in JPEG format") );
    chooser.addChoosableFileFilter(new OpenFileFilter("jpg","Photo in JPEG format") );
    chooser.addChoosableFileFilter(new OpenFileFilter("png","PNG image") );
    chooser.addChoosableFileFilter(new OpenFileFilter("svg","Scalable Vector Graphic") );
    int returnVal = chooser.showSaveDialog(mainWindow);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
         myFilename = chooser.getSelectedFile();
         //do something with the file
    }
    

    下面是我对 FileFilter 的实现。

    /**
     * This class defines which file types are displayed (by default) by the JFileChooser and what file
     * types appear in the drop down menu in the file dialog.
     * You could add more than one file type to the open file dialog by creating multiple instances of this 
     * class and then repeatedly calling addFileFilter.
     * @author LaSpina
     */
    
    import java.io.File;
    import javax.swing.filechooser.*;
    
    public class OpenFileFilter extends FileFilter {
    
        String description = "";
        String fileExt = "";
    
        public OpenFileFilter(String extension) {
            fileExt = extension;
        }
    
        public OpenFileFilter(String extension, String typeDescription) {
            fileExt = extension;
            this.description = typeDescription;
        }
    
        @Override
        public boolean accept(File f) {
            if (f.isDirectory())
                return true;
            return (f.getName().toLowerCase().endsWith(fileExt));
        }
    
        @Override
        public String getDescription() {
            return description;
        }
    }
    

    【讨论】:

    • 好的...我已经决定使用这种方法...非常感谢~
    • 你不应该在OpenFileFilter构造函数的扩展参数中包含句点,这样file.notJpg就不会被接受吗?
    • 是的,我应该。谢谢。
    【解决方案4】:

    从 Java 8 开始,您可以使用 Lambda 表达式:

    fileDialog.setFilenameFilter((File dir, String name) -> name.endsWith(".html"));

    【讨论】:

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