Skip to content

Commit 8e2b302

Browse files
committed
UIService: run UI code on the EDT as needed
With 96827bf, the showUI methods now run on the EDT if the active UI requires it. But the other UI mutators (show, showDialog, chooseFile, chooseFiles, showContextMenu) were still being run naively on the curent thread. This commit fixes the behavior to be consistent with showUI.
1 parent 08e86be commit 8e2b302

File tree

1 file changed

+57
-26
lines changed

1 file changed

+57
-26
lines changed

src/main/java/org/scijava/ui/DefaultUIService.java

+57-26
Original file line numberDiff line numberDiff line change
@@ -162,26 +162,13 @@ public void showUI(final String name) {
162162
@Override
163163
public void showUI(final UserInterface ui) {
164164
log.debug("Launching user interface: " + ui.getClass().getName());
165-
Runnable showUI = () -> {
165+
runOnCorrectThread(ui, () -> {
166166
ui.show();
167167
// NB: Also show all the current displays.
168168
for (final Display<?> display : displayService.getDisplays()) {
169169
ui.show(display);
170170
}
171-
};
172-
173-
// Dispatch on EDT if necessary
174-
if (ui.requiresEDT()) {
175-
try {
176-
threadService.invoke(showUI);
177-
}
178-
catch (InterruptedException | InvocationTargetException e) {
179-
throw new RuntimeException(e);
180-
}
181-
}
182-
else {
183-
showUI.run();
184-
}
171+
});
185172
eventService.publish(new UIShownEvent(ui));
186173
}
187174

@@ -255,17 +242,20 @@ public List<PluginInfo<DisplayViewer<?>>> getViewerPlugins() {
255242

256243
@Override
257244
public void show(final Object o) {
258-
activeUI().show(o);
245+
final UserInterface ui = activeUI();
246+
runOnCorrectThread(ui, () -> ui.show(o));
259247
}
260248

261249
@Override
262250
public void show(final String name, final Object o) {
263-
activeUI().show(name, o);
251+
final UserInterface ui = activeUI();
252+
runOnCorrectThread(ui, () -> ui.show(name, o));
264253
}
265254

266255
@Override
267256
public void show(final Display<?> display) {
268-
activeUI().show(display);
257+
final UserInterface ui = activeUI();
258+
runOnCorrectThread(ui, () -> ui.show(display));
269259
}
270260

271261
@Override
@@ -320,38 +310,64 @@ public DialogPrompt.Result showDialog(final String message,
320310
final String title, final DialogPrompt.MessageType messageType,
321311
final DialogPrompt.OptionType optionType)
322312
{
323-
final DialogPrompt dialogPrompt = //
324-
activeUI().dialogPrompt(message, title, messageType, optionType);
325-
return dialogPrompt == null ? null : dialogPrompt.prompt();
313+
final UserInterface ui = activeUI();
314+
DialogPrompt.Result[] result = new DialogPrompt.Result[1];
315+
runOnCorrectThread(ui, () -> {
316+
final DialogPrompt dialogPrompt = //
317+
ui.dialogPrompt(message, title, messageType, optionType);
318+
result[0] = dialogPrompt == null ? null : dialogPrompt.prompt();
319+
});
320+
return result[0];
326321
}
327322

328323
@Override
329324
public File chooseFile(final File file, final String style) {
330-
return activeUI().chooseFile(file, style);
325+
final UserInterface ui = activeUI();
326+
final File[] result = new File[1];
327+
runOnCorrectThread(ui, () -> {
328+
result[0] = ui.chooseFile(file, style);
329+
});
330+
return result[0];
331331
}
332332

333333
@Override
334334
public File
335335
chooseFile(final String title, final File file, final String style)
336336
{
337-
return activeUI().chooseFile(title, file, style);
337+
final UserInterface ui = activeUI();
338+
final File[] result = new File[1];
339+
runOnCorrectThread(ui, () -> {
340+
result[0] = ui.chooseFile(title, file, style);
341+
});
342+
return result[0];
338343
}
339344

340345
@Override
341346
public File[] chooseFiles(File parent, File[] files, FileFilter filter, String style) {
342-
return activeUI().chooseFiles(parent, files, filter, style);
347+
final UserInterface ui = activeUI();
348+
final File[][] result = new File[1][];
349+
runOnCorrectThread(ui, () -> {
350+
result[0] = ui.chooseFiles(parent, files, filter, style);
351+
});
352+
return result[0];
343353
}
344354

345355
@Override
346356
public List<File> chooseFiles(File parent, List<File> fileList, FileFilter filter, String style) {
347-
return activeUI().chooseFiles(parent, fileList, filter, style);
357+
final UserInterface ui = activeUI();
358+
final List<?>[] result = new List<?>[1];
359+
runOnCorrectThread(ui, () -> {
360+
result[0] = ui.chooseFiles(parent, fileList, filter, style);
361+
});
362+
return (List<File>) result[0];
348363
}
349364

350365
@Override
351366
public void showContextMenu(final String menuRoot, final Display<?> display,
352367
final int x, final int y)
353368
{
354-
activeUI().showContextMenu(menuRoot, display, x, y);
369+
final UserInterface ui = activeUI();
370+
runOnCorrectThread(ui, () -> ui.showContextMenu(menuRoot, display, x, y));
355371
}
356372

357373
@Override
@@ -559,4 +575,19 @@ private UserInterface activeUI() {
559575
// No UI is visible, so use the default one.
560576
return activeUI = getDefaultUI();
561577
}
578+
579+
private void runOnCorrectThread(final UserInterface ui, final Runnable r) {
580+
// Dispatch on EDT if necessary
581+
if (ui.requiresEDT()) {
582+
try {
583+
threadService.invoke(r);
584+
}
585+
catch (InterruptedException | InvocationTargetException e) {
586+
throw new RuntimeException(e);
587+
}
588+
}
589+
else {
590+
r.run();
591+
}
592+
}
562593
}

0 commit comments

Comments
 (0)