Search code examples
javafiledialog

How to filter file type in FileDialog?


I am using FileDialog for saving and loading in a Java program.

How can I filter the dropdown list to specify the file type as "JPG" or "JPEG" etc. ?

I have tried the following code, but it seems to have no effect.

Are there any other ways of doing this ?

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);
        }

Solution

  • I've always used JFileChooser instead of FileDialog. You can then add multiple ChoosableFileFilters for the various types your program will support this way:

    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
    }
    

    Below is my implementation of a 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;
        }
    }