Skip to content

Commit f7e2e28

Browse files
committed
AbstractSwingUI: fix deadlock in chooseFiles method
Modeled after bac7815 (Thanks @ctrueden)
1 parent 754d52f commit f7e2e28

File tree

1 file changed

+32
-20
lines changed

1 file changed

+32
-20
lines changed

src/main/java/org/scijava/ui/swing/AbstractSwingUI.java

+32-20
Original file line numberDiff line numberDiff line change
@@ -164,29 +164,41 @@ public File chooseFile(final File file, final String style) {
164164

165165
@Override
166166
public File[] chooseFiles(final File[] files, final FileFilter filter) {
167-
final JFileChooser chooser = new JFileChooser();
168-
chooser.setMultiSelectionEnabled(true);
169-
chooser.setSelectedFiles(files);
170-
if (filter != null) {
171-
javax.swing.filechooser.FileFilter fileFilter = new javax.swing.filechooser.FileFilter() {
172-
173-
@Override
174-
public String getDescription() {
175-
return filter.toString();
167+
final File[][] result = new File[1][];
168+
try {
169+
// NB: We show the JFileChooser on the EDT because otherwise there could
170+
// be a deadlock, particularly on macOS.
171+
// See the {@link #chooseFile(File, String) chooseFile} method.
172+
threadService.invoke(() -> {
173+
final JFileChooser chooser = new JFileChooser();
174+
chooser.setMultiSelectionEnabled(true);
175+
chooser.setSelectedFiles(files);
176+
if (filter != null) {
177+
javax.swing.filechooser.FileFilter fileFilter = new javax.swing.filechooser.FileFilter() {
178+
179+
@Override
180+
public String getDescription() {
181+
return filter.toString();
182+
}
183+
184+
@Override
185+
public boolean accept(File f) {
186+
if (filter.accept(f)) return true;
187+
return false;
188+
}
189+
};
190+
chooser.setFileFilter(fileFilter);
176191
}
177-
178-
@Override
179-
public boolean accept(File f) {
180-
if (filter.accept(f)) return true;
181-
return false;
192+
int rval = chooser.showOpenDialog(appFrame);
193+
if (rval == JFileChooser.APPROVE_OPTION) {
194+
result[0] = chooser.getSelectedFiles();
182195
}
183-
};
184-
chooser.setFileFilter(fileFilter);
196+
});
185197
}
186-
int rval = chooser.showOpenDialog(appFrame);
187-
if (rval != JFileChooser.APPROVE_OPTION)
188-
return null;
189-
return chooser.getSelectedFiles();
198+
catch (final InvocationTargetException | InterruptedException exc) {
199+
log.error(exc);
200+
}
201+
return result[0];
190202
}
191203

192204
@Override

0 commit comments

Comments
 (0)