21

When using Java applications, every time I open a dialog box, the starting directory is always my home directory. Is there any way to make it remember the last used directory?

Alternately, are there improved Java file selection dialogs that allow type-to-search or any of the features that are standard in most other application file selection dialogs?

EDIT: I think the answers posted address the question for writing Java applications, but not for a user. Perhaps it's not possible for the user to change the file browser interface, but I'd like to know that. In case it matters, I have a few specific examples in mind (Amazon AWS uploader) but I have observed that behavior in most Java applications that use a file browser.

Mahozad
  • 18,032
  • 13
  • 118
  • 133
keflavich
  • 18,278
  • 20
  • 86
  • 118

5 Answers5

41

JFileChooser does not remember it. However, Java provides a Preferences API

Preferences prefs = Preferences.userRoot().node(getClass().getName());
JFileChooser chooser = new JFileChooser(prefs.get(LAST_USED_FOLDER,
    new File(".").getAbsolutePath()));
int returnVal = chooser.showOpenDialog(null);
if (returnVal == JFileChooser.APPROVE_OPTION) {
    // do something
    prefs.put(LAST_USED_FOLDER, chooser.getSelectedFile().getParent());
}
jmattheis
  • 10,494
  • 11
  • 46
  • 58
Archimedes Trajano
  • 35,625
  • 19
  • 175
  • 265
15

Store the file chooser as a class attribute. When it is re-opened, the following will be preserved.

  1. The directory.
  2. The place in the directory to where the user had scrolled.
  3. The selected file filter.
  4. The size.
  5. The location on screen.
  6. The PLAF.
  7. ..

Is there any way to make it remember the last used directory?

Of course, if you mean persist the state between runs, there are a number of alternative forms of storing the details, and places/ways to store them. See this answer for an example of storing the bounds of a JFrame using a Properties file.


Perhaps it's not possible for the user to change the file browser interface, ..

What 'user'? Do you mean the developer who uses one in an app.?

Maybe what you need is to implement your own file chooser. If that is the case, you might start with the FileBro code.

Community
  • 1
  • 1
Andrew Thompson
  • 168,117
  • 40
  • 217
  • 433
  • +1 so simple. In other words, only create one and just reuse it over and over so it retains its state (selection, location, etc.) – Nate W. Nov 27 '11 at 04:49
  • By 'user', I meant end-user, not developer. I am frequently forced to use java applications written by others that have file browser interfaces I don't like. I suppose if I can get access to the source, I can change the file browser and repackage the code, so to that end your answer is pretty helpful. – keflavich Nov 28 '11 at 17:13
  • Size and position are reset on every `showOpenDialog` for me (Java 17) when JFileChooser is kept as a field. The location is persisted indeed. – Basilevs Mar 19 '23 at 08:23
9

Swing JFileChooser has an method to set the initial directory. setCurrentDirectory(File dir) After the file has been chosen you can get the selected directory by calling getCurrentDirectory and store it in some config file of your app.

Wojciech Owczarczyk
  • 5,595
  • 2
  • 33
  • 55
2

You can cache the last dir location in application and while opening the file chooser specify the default location by setCurrentDirectory

jmj
  • 237,923
  • 42
  • 401
  • 438
0

Here i used a simple code with directory dialog to open with last use directory

IDialogSettings dialogSettings = Activator.getDefault().getDialogSettings(); 
    String lastUsedPath = dialogSettings.get(IAntUIConstants.DIALOGSTORE_LASTANTHOME);
    if (lastUsedPath == null) {
        lastUsedPath = "c:\\";
    }
    DirectoryDialog dialog = new DirectoryDialog(Display.getDefault().getActiveShell());
    dialog.setFilterPath(lastUsedPath);
    String location = dialog.open();
    if (location == null) {
        return;
    }
    dialogSettings.put(IAntUIConstants.DIALOGSTORE_LASTANTHOME, location); 
      AntCorePreferences preferences = AntCorePlugin.getPlugin().getPreferences(); 
      String defaultHome = preferences.getAntHome(); 
      if (location.equalsIgnoreCase(defaultHome)) { 
          location = null; 
      } 
V Kash Singh
  • 469
  • 4
  • 4