2011-10-05 52 views
6

Sto scrivendo un RCP Eclipse e desidero chiedere all'utente se eseguire il backup del database quando l'applicazione viene chiusa. Farlo dal menu File> Exit è stato facile come ho definito un comando exit:Gestire la chiusura della finestra workbench nell'applicazione RCP Java

public class ExitCommand extends AbstractHandler implements IHandler { 

@Override 
public Object execute(ExecutionEvent event) throws ExecutionException { 
    final IWorkbench workbench = PlatformUI.getWorkbench(); 
    if (workbench == null) 
     return null; 

    // Ask whether the user wants to back up the information 
    Shell shell = new Shell(workbench.getDisplay()); 
    MessageBox messageBox = new MessageBox(shell, SWT.ICON_QUESTION 
      | SWT.YES | SWT.NO); 
    messageBox.setMessage("You are leaving CatSysPD. Do you want to make a backup of the DataBase? (recommended)"); 
    messageBox.setText("On Exit Backup"); 
    int response = messageBox.open(); 
    if (response == SWT.YES){ 
     new BackupDataBaseAction(shell); 
    } 

    final Display display = workbench.getDisplay(); 
    display.syncExec(new Runnable() { 
     public void run() { 
      if (!display.isDisposed()) 
       workbench.close(); 
     } 
    }); 
    return null; 
}} 

Poi ho collegato questo a una voce di menu denominata Exit e questo lavoro giusto. Tuttavia l'utente potrebbe chiudere l'applicazione anche premendo il pulsante "Chiudi finestra". C'è un modo per catturare questo evento?

Ho trovato un suggerimento in un argomento precedente (see here) utilizzando un shutdownHook. Tuttavia il thread che voglio eseguire deve aprire una finestra di dialogo e, come ho capito, questo non può essere fatto da un thread esterno.

Grazie!

Edit aggiungo qui il codice per lo shutdownHook sto usando. Nella classe Application: public class applicazione implementa IApplication {

final double NIDAQmxPortingVersionDependency = 1.001; 

public final static String PLUGIN_ID = "CatsysPD"; 
private static Logger logger = Logger.getLogger(Application.class 
     .toString()); 

/* 
* (non-Javadoc) 
* 
* @see org.eclipse.equinox.app.IApplication#start(org.eclipse.equinox.app. 
* IApplicationContext) 
*/ 
public Object start(IApplicationContext context) { 
    logger.info("Starting the application"); 
    Display display = PlatformUI.createDisplay(); 
    systemCheck(display); 
    initializeApplication(display); 
    try { 
     int returnCode = PlatformUI.createAndRunWorkbench(display, 
       new ApplicationWorkbenchAdvisor()); 
     if (returnCode == PlatformUI.RETURN_RESTART) { 
      return IApplication.EXIT_RESTART; 
     } 
     BackupOnExitHook backupOnExitHook = new BackupOnExitHook(PlatformUI.getWorkbench().getDisplay()); 
     Runtime.getRuntime().addShutdownHook(backupOnExitHook); 
     return IApplication.EXIT_OK; 
    } finally { 
     display.dispose(); 
    } 
} 

private void systemCheck(Display display) {...} 

public void stop() {...} 

public void initializeApplication(Display display) {...} 

private class BackupOnExitHook extends Thread { 

    private Display display; 

    public BackupOnExitHook(Display display){ 
     this.display = display; 
    } 

    @Override 
    public void run(){ 
     display.syncExec(new Runnable(){ 

      @Override 
      public void run() { 
       MessageBox messageBox = new MessageBox(new Shell(display), SWT.ICON_QUESTION 
         | SWT.YES | SWT.NO); 
       messageBox.setMessage("You are leaving CatSysPD. Do you want to make a backup of the DataBase? (recommended)"); 
       messageBox.setText("On Exit Backup"); 
       int response = messageBox.open(); 
       if (response == SWT.YES){ 
        new BackupDataBaseAction(new Shell(display)); 
       } 
      }}); 


    } 

} 
} 

L'errore che ottengo quando provo a farlo funzionare è:

Exception in thread "Thread-5" org.eclipse.swt.SWTException: Device is disposed 
at org.eclipse.swt.SWT.error(SWT.java:4083) 
at org.eclipse.swt.SWT.error(SWT.java:3998) 
at org.eclipse.swt.SWT.error(SWT.java:3969) 
at org.eclipse.swt.widgets.Display.error(Display.java:1249) 
at org.eclipse.swt.widgets.Display.syncExec(Display.java:4581) 
at dk.catsys.pd.Application$BackupOnExitHook.run(Application.java:128) 

Grazie ancora.

risposta

Problemi correlati