2011-10-05 4 views
6

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) 

다시 한 번 감사드립니다.

답변

관련 문제