2011-10-05 10 views
6

में वर्कबेंच विंडो के समापन को संभालने के लिए मैं एक ग्रहण आरसीपी लिख रहा हूं और मैं उपयोगकर्ता से पूछना चाहता हूं कि एप्लिकेशन बंद होने पर डेटाबेस बैकअप लेना है या नहीं।जावा आरसीपी अनुप्रयोग

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; 
}} 

मैं तो एक मेनू प्रविष्टि कहा जाता है से बाहर निकलें करने के लिए इस लिंक किया है और यह काम सही: फ़ाइल से यह कर> बाहर निकलें मेनू आसान के रूप में मैं एक आदेश से बाहर निकलें परिभाषित किया गया था। हालांकि उपयोगकर्ता "बंद विंडो" बटन दबाकर भी एप्लिकेशन को बंद कर सकता है। क्या इस घटना को पकड़ने का कोई तरीका है?

मुझे शटडाउन हुक का उपयोग करके पिछले विषय (see here) में एक सुझाव मिला। हालांकि, जो थ्रेड मैं निष्पादित करना चाहता हूं उसे एक संवाद खोलना है और जैसा कि मैं समझता हूं, यह बाहरी धागे द्वारा नहीं किया जा सकता है।

धन्यवाद!

संपादित करें मैं यहां शटडाउन के लिए कोड जोड़ता हूं जिसे मैं उपयोग कर रहा हूं। आवेदन वर्ग में: सार्वजनिक वर्ग आवेदन लागू करता 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) 

धन्यवाद फिर से।

उत्तर

संबंधित मुद्दे