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.
Il tuo suggerimento funziona bene per me. Grazie! –