Eclipse RCP를 작성 중이며 응용 프로그램이 닫힐 때 데이터베이스를 백업할지 여부를 사용자에게 묻고 싶습니다.Java RCP 응용 프로그램에서 Workbench 창의 닫기 처리
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;
}}
내가 다음 메뉴 항목이라고 종료에이 연결되어이 작품의 권리 : 나는 종료 명령을 정의 파일에서 그 일을> 종료 메뉴가 쉬웠다. 그러나 사용자는 "창 닫기"버튼을 눌러 애플리케이션을 닫을 수도 있습니다. 이 이벤트를 잡는 방법이 있습니까?
shutdownHook을 사용하여 이전 주제 (see here)에서 제안을 발견했습니다. 그러나 내가 원하는 스레드는 대화 상자를 열어야하는데, 이해할 수있는 것처럼 외부 스레드가이를 수행 할 수는 없습니다.
감사합니다.
내가 사용중인 시스템 종료 코드를 추가합니다. Application 클래스에서 : 공용 클래스 응용 프로그램 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));
}
}});
}
}
}
내가 그것을 실행하려고하면 내가 오류는 다음과 같습니다
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)
다시 한 번 감사드립니다.
제안 사항은 저에게 잘 맞습니다. 감사! –