1515
1616import java .io .File ;
1717import java .nio .file .Files ;
18+ import java .nio .file .FileSystems ;
1819import java .nio .file .Path ;
1920import java .util .List ;
2021import java .util .Objects ;
@@ -74,10 +75,7 @@ public DirectoryChooser newDirectoryChooser(String title) {
7475 DirectoryChooser directoryChooser = new DirectoryChooser ();
7576 directoryChooser .setTitle (title );
7677 initialDirectory .ifPresent (file -> {
77- if (Files .isDirectory (file .toPath ()))
78- directoryChooser .setInitialDirectory (file );
79- else
80- directoryChooser .setInitialDirectory (file .toPath ().getParent ().toFile ());
78+ directoryChooser .setInitialDirectory (getChooserInitialDirectory (file ));
8179 });
8280 return directoryChooser ;
8381 }
@@ -86,15 +84,31 @@ public FileChooser newFileChooser(String title) {
8684 final FileChooser fileChooser = new FileChooser ();
8785 fileChooser .setTitle (title );
8886 initialDirectory .ifPresent (file -> {
89- if (Files .isDirectory (file .toPath ()))
90- fileChooser .setInitialDirectory (file );
91- else
92- fileChooser .setInitialDirectory (file .toPath ().getParent ().toFile ());
87+ fileChooser .setInitialDirectory (getChooserInitialDirectory (file ));
9388 });
9489
9590 return fileChooser ;
9691 }
9792
93+ /**
94+ * Resolve a file to a valid base browsing directory
95+ * @param referenceFile The base directory or a child file that should be used as a browsing base path
96+ * @return A valid directory's File object
97+ */
98+ private static File getChooserInitialDirectory (File referenceFile ) {
99+ // Search for an existing directory
100+ while (referenceFile != null ){
101+ if (Files .isDirectory (referenceFile .toPath ())) {
102+ return referenceFile ;
103+ }
104+ referenceFile = referenceFile .getParentFile ();
105+ }
106+
107+ // No parent file could be found or referenceFile
108+ // Default to returning a path to the first drive available
109+ return FileSystems .getDefault ().getRootDirectories ().iterator ().next ().toFile ();
110+ }
111+
98112 public Path workingDirectory () {
99113 return workingDirectory .orElseGet (this ::workingDirectorySupplier );
100114 }
0 commit comments