@@ -162,26 +162,13 @@ public void showUI(final String name) {
162
162
@ Override
163
163
public void showUI (final UserInterface ui ) {
164
164
log .debug ("Launching user interface: " + ui .getClass ().getName ());
165
- Runnable showUI = () -> {
165
+ runOnCorrectThread ( ui , () -> {
166
166
ui .show ();
167
167
// NB: Also show all the current displays.
168
168
for (final Display <?> display : displayService .getDisplays ()) {
169
169
ui .show (display );
170
170
}
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
+ });
185
172
eventService .publish (new UIShownEvent (ui ));
186
173
}
187
174
@@ -255,17 +242,20 @@ public List<PluginInfo<DisplayViewer<?>>> getViewerPlugins() {
255
242
256
243
@ Override
257
244
public void show (final Object o ) {
258
- activeUI ().show (o );
245
+ final UserInterface ui = activeUI ();
246
+ runOnCorrectThread (ui , () -> ui .show (o ));
259
247
}
260
248
261
249
@ Override
262
250
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 ));
264
253
}
265
254
266
255
@ Override
267
256
public void show (final Display <?> display ) {
268
- activeUI ().show (display );
257
+ final UserInterface ui = activeUI ();
258
+ runOnCorrectThread (ui , () -> ui .show (display ));
269
259
}
270
260
271
261
@ Override
@@ -320,38 +310,64 @@ public DialogPrompt.Result showDialog(final String message,
320
310
final String title , final DialogPrompt .MessageType messageType ,
321
311
final DialogPrompt .OptionType optionType )
322
312
{
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 ];
326
321
}
327
322
328
323
@ Override
329
324
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 ];
331
331
}
332
332
333
333
@ Override
334
334
public File
335
335
chooseFile (final String title , final File file , final String style )
336
336
{
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 ];
338
343
}
339
344
340
345
@ Override
341
346
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 ];
343
353
}
344
354
345
355
@ Override
346
356
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 ];
348
363
}
349
364
350
365
@ Override
351
366
public void showContextMenu (final String menuRoot , final Display <?> display ,
352
367
final int x , final int y )
353
368
{
354
- activeUI ().showContextMenu (menuRoot , display , x , y );
369
+ final UserInterface ui = activeUI ();
370
+ runOnCorrectThread (ui , () -> ui .showContextMenu (menuRoot , display , x , y ));
355
371
}
356
372
357
373
@ Override
@@ -559,4 +575,19 @@ private UserInterface activeUI() {
559
575
// No UI is visible, so use the default one.
560
576
return activeUI = getDefaultUI ();
561
577
}
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
+ }
562
593
}
0 commit comments