3636import java .io .File ;
3737import java .util .function .Consumer ;
3838
39- /**
40- * {@link CMFileChooser} implementation backed by Swing's {@link JFileChooser}.
41- */
4239public class SwingFileChooser implements CMFileChooser {
4340
4441 private final Component parent ;
@@ -51,43 +48,41 @@ public SwingFileChooser(Component parent, String title) {
5148
5249 @ Override
5350 public File openFile (File initialDir , FileFilter filter ) {
54- return showOpen (
55- JFileChooser .FILES_ONLY ,
56- c -> { if (initialDir != null ) c .setCurrentDirectory (initialDir ); },
57- filter );
51+ return showOpen (JFileChooser .FILES_ONLY , initialDir , c -> {}, filter );
5852 }
5953
6054 @ Override
6155 public File openFile (FileChooserPrefs prefs , FileFilter filter ) {
62- return showOpen (JFileChooser .FILES_ONLY , prefs ::bind , filter );
56+ return showOpen (JFileChooser .FILES_ONLY , prefs . getDir (), prefs ::bind , filter );
6357 }
6458
6559 @ Override
6660 public File openDir (File initialDir ) {
67- return showOpenDir (parent , title , c -> { if ( initialDir != null ) c . setCurrentDirectory ( initialDir ); });
61+ return showOpenDir (parent , title , initialDir , c -> {});
6862 }
6963
7064 @ Override
7165 public File openDir (FileChooserPrefs prefs ) {
72- return showOpenDir (parent , title , prefs ::bind );
66+ return showOpenDir (parent , title , prefs . getDir (), prefs ::bind );
7367 }
7468
7569 @ Override
7670 public File saveFile (FileChooserPrefs prefs , String defaultName ) {
77- return showSave (prefs ::bind , defaultName );
71+ return showSave (prefs . getDir (), prefs ::bind , defaultName );
7872 }
7973
8074 @ Override
8175 public File saveDir (File initialDir ) {
82- return showOpenDir (parent , title , c -> { if ( initialDir != null ) c . setCurrentDirectory ( initialDir ); });
76+ return showOpenDir (parent , title , initialDir , c -> {});
8377 }
8478
8579 // setControlButtonsAreShown(false) + custom buttons: on macOS Aqua L&F the built-in
8680 // approve button is continuously re-disabled when nothing is selected (e.g. after
8781 // navigating into a directory). The custom dialog owns its own always-enabled "Select"
8882 // button and a "New Folder" button, and is used on all platforms for consistency.
89- public static File showOpenDir (Component parent , String title , Consumer <JFileChooser > init ) {
90- JFileChooser chooser = new JFileChooser ();
83+
84+ public static File showOpenDir (Component parent , String title , File startDir , Consumer <JFileChooser > init ) {
85+ JFileChooser chooser = new JFileChooser (startDir );
9186 chooser .setFileSelectionMode (JFileChooser .DIRECTORIES_ONLY );
9287 chooser .setControlButtonsAreShown (false );
9388 init .accept (chooser );
@@ -148,8 +143,8 @@ public static File showOpenDir(Component parent, String title, Consumer<JFileCho
148143 return selected != null ? selected : chooser .getCurrentDirectory ();
149144 }
150145
151- private File showOpen (int mode , Consumer <JFileChooser > init , FileFilter filter ) {
152- JFileChooser chooser = new JFileChooser ();
146+ private File showOpen (int mode , File startDir , Consumer <JFileChooser > init , FileFilter filter ) {
147+ JFileChooser chooser = new JFileChooser (startDir );
153148 chooser .setFileSelectionMode (mode );
154149 init .accept (chooser );
155150 if (title != null ) {
@@ -164,8 +159,8 @@ private File showOpen(int mode, Consumer<JFileChooser> init, FileFilter filter)
164159 : null ;
165160 }
166161
167- private File showSave (Consumer <JFileChooser > init , String defaultName ) {
168- JFileChooser chooser = new JFileChooser ();
162+ private File showSave (File startDir , Consumer <JFileChooser > init , String defaultName ) {
163+ JFileChooser chooser = new JFileChooser (startDir );
169164 init .accept (chooser );
170165 if (title != null ) {
171166 chooser .setDialogTitle (title );
0 commit comments