import javax.swing.*;
import javax.swing.filechooser.FileFilter;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

        // Display a JFileDialog and allow .java files to be
        // selected. The selected files are displayed in a JList
        // within the frame.
class SwingFileChooserFrame extends JFrame {
    public SwingFileChooserFrame() {
        final int width = 300, height = 300;
        final Container contents = getContentPane();

        setSize(width,height);

        // Place a JList in the center to display the selected files.
        contents.add(getFileList(),"Center");
        JPanel buttonPanel = new JPanel();
        JButton select = new JButton("Choose a File");
        select.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e){
                chooseFrom(".");
            }
        });
        buttonPanel.add(select);
        buttonPanel.add(new QuitJButton());
        contents.add(buttonPanel,"South");
    }

        // Choose one or more files from the given folder.
    public void chooseFrom(String folder){
        final Container contents = getContentPane();
        final JLabel where = new JLabel(folder,JLabel.CENTER);
        contents.add(where,"North");

        // Make sure that folder is a directory.
        File source = new File(folder);
        while((folder != null) && !source.isDirectory()){
            folder = JOptionPane.showInputDialog(this,
                        folder+" is not a folder. Try again",
                        "Type a Folder Name",
                        JOptionPane.ERROR_MESSAGE);
            if(folder != null){
                source = new File(folder);
            }
        }
        if(folder != null){
            displayChooser(source);
        }
    }

        // Display only .java files and folders within the source folder.
        // Only allow .java files to be selected.
    protected void displayChooser(File source){
        // Set up the dialog.
        final JFileChooser chooser = new JFileChooser();
        chooser.setCurrentDirectory(source);
        // Only files may be selected.
        chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
        // Only allow single selections.
        chooser.setMultiSelectionEnabled(false);
        // Only .java files may be chosen.
        final FileFilter choosableFiles =
                    new SuffixFileFilter("java","Java Source Files");
        // Only display folders and .java files.
        chooser.setFileFilter(new FileFilter(){
            public boolean accept(File f){
                return (f != null) &&
                    (f.isDirectory() || choosableFiles.accept(f));
            }

            public String getDescription(){
                return "Folders and Java Source Files";
            }
        });
        chooser.addChoosableFileFilter(choosableFiles);

        // Show the file chooser..
        if(chooser.showDialog(this,"Select") ==
                            JFileChooser.APPROVE_OPTION){
            // Transfer the selected file to the file list.
            final DefaultListModel model =
                    (DefaultListModel) getFileList().getModel();
            File selection = chooser.getSelectedFile();
            model.addElement(selection);
        }
    }

    protected JList getFileList(){
        return fileList;
    }

    // The list of selected files.
    private final JList fileList = new JList(new DefaultListModel());
}
