# Java: JFileChooser

The `javax.swing.JFileChooser` class is used to create file choosers for selecting files or directories to open or save.

## To Create an Open File Chooser

The sample code below uses JFileChooser in the Open button action listener.

      1
      2
      3
      4
      5
      6
      7
      8
      9
     10
     11
     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
    // File   : filechooser/CountWords.java
    // Purpose: Counts words in file.  Illustrates JFileChooser.
    //          Java 5: Scanner.
    // Author : Fred Swartz
    // Date   : 2005-02-23

    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import java.io.*;
    import java.util.*;

    //////////////////////////////////////////////////////// main class
    public class CountWords {
        public static void main(String[] args) {
            JFrame window = new JFrame("Count Words");
            window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            window.setContentPane(new CountWordsGUI());
            window.pack();
            window.setVisible(true);
        }
    }

    ////////////////////////////////////////////////////// CountWordsGUI
    class CountWordsGUI extends JPanel {

        //... Instance variables
        JTextField   m_fileNameTF  = new JTextField(15);
        JTextField   m_wordCountTF = new JTextField(4);
        JFileChooser m_fileChooser = new JFileChooser();

        //================================================== constructor
        CountWordsGUI() {
            m_fileNameTF.setEditable(false);
            m_wordCountTF.setEditable(false);
            JButton openButton = new JButton("Open");

            //... Add listeners
            openButton.addActionListener(new OpenAction());

            //... Layout components
            setLayout(new FlowLayout());
            add(openButton);
            add(m_fileNameTF);
            add(new JLabel("Word Count"));
            add(m_wordCountTF);
        }

        //================================================== processFile
        private int countWordsInFile(File f) {

            int numberOfWords = 0;  // For counting words.

            try {
                Scanner wordScanner = new Scanner(f);
                wordScanner.useDelimiter("[^A-Za-z]+");

                while (wordScanner.hasNext()) {
                    String word = wordScanner.next();
                    numberOfWords++;
                }

            } catch (FileNotFoundException fnfex) {
                JOptionPane.showMessageDialog(CountWordsGUI.this,
                            "You gave me an unreadable file");
            }
            return numberOfWords;
        }

        //////////////////////////////////////////// Open button listener
        class OpenAction implements ActionListener {
            public void actionPerformed(ActionEvent ae) {
                //... Open a file dialog.
                int retval = m_fileChooser.showOpenDialog(CountWordsGUI.this);
                if (retval == JFileChooser.APPROVE_OPTION) {
                    //... The user selected a file, process it.
                    File file = m_fileChooser.getSelectedFile();
                    countWordsInFile(file);

                    //... Update user interface.
                    m_fileNameTF.setText(file.getName());
                    m_wordCountTF.setText("" + countWordsInFile(file));
                }
            }
        }
    }

## To display a file chooser

Use one of three methods to display the dialog after it has been created.

       r = fc.showOpenDialog(owner); // button labeled "Open"
       r = fc.showSaveDialog(owner); // button labeled "Save"
       r = fc.showDialog(owner, title);

The owner parameter is the component (eg, JFrame, JPanel, ...) over which the dialog should be centered. You can use `null` for the owner, which will put the dialog in the center of the screen. To get the enclosing class's instance, as in this example, write the enclosing class name followed by ".this". The title parameter is a string that is used as the dialog's title and accept button text.

## Checking the return value

The user may either select a file or directory, or click CANCEL or close the file chooser window. If the user selected a file or directory, the value returned will be `JFileChooser.APPROVE_OPTION`. Always check this value. For example,

    int retval = fc.showOpenDialog(null);
    if (retval == JFileChooser.APPROVE_OPTION) {
        . . . // The user did select a file.;

## Getting the selected file or directory

After checking for `JFileChooser.APPROVE_OPTION`, the `File` value of the selection is returned from a call on `getSelectedFile`.

    int retval = fc.showOpenDialog(null);
    if (retval == JFileChooser.APPROVE_OPTION) {
        File myFile = fc.getSelectedFile();
        // DO YOUR PROCESSING HERE. OPEN FILE OR ...
    }

## Why a file chooser is often an instance variable

Altho a new file chooser can be created inside a listener, there are advantages to creating it once outside and reusing it.

- A file chooser remembers the directory that was last used so any reuse opens in the same directory.
- It is also more efficient since it is created only once and customizations only have to be done once. This increases the response speed.

## Files, directories, or both

By default a file chooser allows the user to select only files. To allow selection of either files or directories, or only directories, use one of the following calls.

       fc.setFileSelectionMode(JFileChooser.FILES_ONLY);   // default
       fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
       fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);

## Filtering files

You can specify the kinds of files that should be shown (eg, with a specific extension, ...), but supplying a `JFileFilter`.

       myChooser.setFileFilter(FileFilter filter);

See FileFilter. [NEEDS MORE WORK]

## Specify a start directory in the constructor

The file chooser will start the file dialog at some default directory, for example, "`C:\My Documents`". To start the dialog at a different directory (called the current directory), specify the directory path as a `String` or `File` value in the `JFileChooser` constructor.

    JFileChooser m_fileChooser = new JFileChooser("C:\home");

The current directory is ".".

Portability warning: If you put system specific file paths in your code, the program will not be portable to other systems. Note that the above call is therefore not portable.