2017-04-04 90 views
0

我想實現很簡單:我希望用戶不能夠看到應用程序時未登錄他顯示登錄對話框應用程序之前

所以我需要做的是顯示的登錄。對話框,然後創建應用程序。我試圖在IApplication#start(IApplicationContext)中做到這一點,但該方法顯然不在UI線程中運行,所以我沒有運氣讓對話顯示在那裏。

後來我試着WorkbenchAdvisor#preStartup()

public void preStartup() { 
    if (openLoginDialog() != Window.OK) { 
     getWorkbenchConfigurer().emergencyClose(); 
    } 
} 

我不認爲emergencyClose()是在這裏調用正確的方法,但IWorkbench#close()拋出一個NullPointerException,仍然打開一個窗口存根。

好,emergencyClose()拋出NullPointerException爲好,但比其他按預期工作:

java.lang.NullPointerException 
at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1204) 
at org.eclipse.ui.internal.Workbench.access$22(Workbench.java:1113) 
at org.eclipse.ui.internal.Workbench$19.run(Workbench.java:1454) 
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70) 
at org.eclipse.ui.internal.Workbench.close(Workbench.java:1451) 
at org.eclipse.ui.internal.WorkbenchConfigurer.emergencyClose(WorkbenchConfigurer.java:159) 
at org.acme.project.ApplicationWorkbenchAdvisor.preStartup(ApplicationWorkbenchAdvisor.java:36) 
at org.eclipse.ui.internal.Workbench$24.runWithException(Workbench.java:1718) 
at org.eclipse.ui.internal.StartupThreading$StartupRunnable.run(StartupThreading.java:32) 
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35) 
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:135) 
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:4155) 
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3772) 
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2989) 
at org.eclipse.ui.internal.Workbench.access$9(Workbench.java:2894) 
at org.eclipse.ui.internal.Workbench$5.run(Workbench.java:685) 
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337) 
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:606) 
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150) 

是否有辦法防止異常?還是有更好的方式來打開第一個應用程序窗口打開之前的登錄對話框?

+0

大多數人似乎都使用Splash屏幕進行登錄。在xxx.product文件編輯器的'Splash'選項卡上有一個模板(從未嘗試過)。 –

+0

@ greg-449這是一個很棒的功能。糟糕的GUI支持,但很棒的功能。現在它按預期工作,謝謝。 –

回答

0

你可以像這樣在IApplication#start(IApplicationContext)的UI線程中調用一些方法。但我不確定這是否正確。

final int[] result = new int[]{0}; 
Display.syncExec(new Runnable() { 
    result[0] = new YourLoginDialog(Display.getCurrent().getShell()).open(); 
}); 
if (result[0] != Windows.OK) { 
    // failed to login 
    return IApplicaton.EXIT_OK; 
} 
+0

檢查你的IApplication#啓動方法,你可能會發現一些方法創建顯示。 – Zaphod

相關問題