Java: JFileChooser
Use javax.swing.JFileChooser
to create a file chooser for selecting a file or directory
to open or save.
To Create an Open File Chooser
The code below creates a window with an Open... menu item, whose listener pops up a JFileChooser dialog.
The JFileChooser dialog box looks like the following.
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 89 90 91 92 93 94 95 96 97 98 99 100 |
// File : gui/containers/dialogs/filechooser/CountWords.java // Purpose: Counts words in file. // Illustrates menus, JFileChooser, Scanner.. // Author : Fred Swartz - 2006-10-10 - Placed in public domain. import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; import java.util.*; //////////////////////////////////////////////////////// CountWords public class CountWords extends JFrame { //====================================================== fields JTextField _fileNameTF = new JTextField(15); JTextField _wordCountTF = new JTextField(4); JFileChooser _fileChooser = new JFileChooser(); //================================================= constructor CountWords() { //... Create / set component characteristics. _fileNameTF.setEditable(false); _wordCountTF.setEditable(false); //... Add listeners //... Create content pane, layout components JPanel content = new JPanel(); content.setLayout(new FlowLayout()); content.add(new JLabel("File:")); content.add(_fileNameTF); content.add(new JLabel("Word Count:")); content.add(_wordCountTF); //... Create menu elements (menubar, menu, menu item) JMenuBar menubar = new JMenuBar(); JMenu fileMenu = new JMenu("File"); JMenuItem openItem = new JMenuItem("Open..."); openItem.addActionListener(new OpenAction()); //... Assemble the menu menubar.add(fileMenu); fileMenu.add(openItem); //... Set window characteristics this.setJMenuBar(menubar); this.setContentPane(content); this.setTitle("Count Words"); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.pack(); // Layout components. this.setLocationRelativeTo(null); // Center window. } //============================================= countWordsInFile private int countWordsInFile(File f) { int numberOfWords = 0; // Count of words. try { Scanner in = new Scanner(f); while (in.hasNext()) { String word = in.next(); // Read a "token". numberOfWords++; } in.close(); // Close Scanner's file. } catch (FileNotFoundException fnfex) { // ... We just got the file from the JFileChooser, // so it's hard to believe there's problem, but... JOptionPane.showMessageDialog(CountWords.this, fnfex.getMessage()); } return numberOfWords; } ///////////////////////////////////////////////////// OpenAction class OpenAction implements ActionListener { public void actionPerformed(ActionEvent ae) { //... Open a file dialog. int retval = _fileChooser.showOpenDialog(CountWords.this); if (retval == JFileChooser.APPROVE_OPTION) { //... The user selected a file, get it, use it. File file = _fileChooser.getSelectedFile(); //... Update user interface. _fileNameTF.setText(file.getName()); _wordCountTF.setText("" + countWordsInFile(file)); } } } //========================================================= main public static void main(String[] args) { JFrame window = new CountWords(); window.setVisible(true); } } |
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, ...), by 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.