2017-09-08 4 views
0

Wie schließe ich ein Dialog in einem SelectionListener? Derzeit ist mein SelectionListener sieht wie folgt aus:JFace schließen Dialog im SelectionListener

public void widgetSelected(SelectionEvent e) { 
    ICommandService commandService = (ICommandService) PlatformUI.getWorkbench() 
      .getService(ICommandService.class); 
    IHandlerService handlerService = (IHandlerService) PlatformUI.getWorkbench() 
      .getService(IHandlerService.class); 

    Command command = commandService 
      .getCommand("com.mainfirst.backoffice.gui.accounting.command.createBookingReversal"); 

    Map<String, String> params = new HashMap<String, String>(); 
    params.put("com.mainfirst.backoffice.gui.accounting.reversalCodeParameter", 
      String.valueOf(model.getVal().getCode())); 

    ParameterizedCommand paraCommand = ParameterizedCommand.generateCommand(command, params); 

    try { 
     handlerService.executeCommand(paraCommand, null); 
    } catch (Exception ex) { 
     Status status = new Status(IStatus.ERROR, AccountingActivator.PLUGIN_ID, 
       "Error opening reversal wizard", ex); 
     StatusManager.getManager().handle(status, StatusManager.SHOW); 
     throw new RuntimeException(ex); 
    } 
    close(); 
} 

Wie man sehen kann ich close(); nennen, aber die Dialog nicht bleiben am Ende offen. Das Verschieben des Anrufs innerhalb eines finally Blocks hilft ebenfalls nicht. Mein Befehl öffnet eine neue Wizard vor der Dialog. Muß ich die Dialog schließen, bevor die Wizard öffnet?

+0

@ greg-449 die Frage bearbeitet. [hier] (https://stackoverflow.com/questions/46113246/jface-disable-finish-button-in-wizard) ist meine zweite Frage – XtremeBaumer

+0

Was macht der Befehl? Erwarten Sie, dass der Dialog geschlossen wird, bevor der Befehl beendet wird (wird nicht ausgeführt)? –

+0

Der Befehl ruft den Handler auf, der wiederum nur den Assistenten öffnet. Ich erwarte, dass der Dialog geschlossen wird, sobald auf die Schaltfläche geklickt wird, aber der Befehl sollte trotzdem ausgeführt werden – XtremeBaumer

Antwort

1

Wenn das Dialogfeld geschlossen werden soll, bevor der Befehl ausgeführt wird, müssen Sie den Befehl asynchron ausführen. Verwenden Sie hierzu Display.asyncExec. Verwenden Sie so etwas wie:

public void widgetSelected(SelectionEvent e) { 

    Display.getDefault().asyncExec(() -> 
     { 
      ... code to call command 
     }); 

    close(); 
} 

(unter der Annahme, Java 8, verwenden Sie einen Runnable für Java 7 oder früher).

Verwandte Themen