2017-04-04 2 views
0

Was ich erreichen will, ist ziemlich einfach: Ich möchte der Benutzer nicht in der Lage sein, die Anwendung zu sehen, wenn er nicht angemeldet istAnzeigen Anmeldung Dialog vor der Anwendung

Also, was ich tun muss, ist eine Anmeldung zu zeigen. Dialog, dann erstellen Sie die Anwendung. Ich habe versucht, genau das in IApplication#start(IApplicationContext) zu tun, aber diese Methode wird offensichtlich nicht im UI-Thread ausgeführt, so hatte ich kein Glück, um Dialoge zu bekommen, um dort zu zeigen.

Danach habe ich versucht, WorkbenchAdvisor#preStartup():

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

Ich glaube nicht, emergencyClose() die richtige Methode ist hier zu nennen, aber IWorkbench#close() wirft ein NullPointerException und öffnet noch ein Fenster Stummel.

Nun, wirft emergencyClose()NullPointerException auch, aber anders als das funktioniert wie erwartet:

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) 

Gibt es eine Möglichkeit, diese Ausnahme zu verhindern? Oder gibt es eine bessere Möglichkeit, einen Anmeldedialog zu öffnen, bevor das erste Anwendungsfenster geöffnet wird?

+0

Die meisten scheinen den Begrüßungsbildschirm zum Anmelden zu verwenden. Dazu gibt es auf der Registerkarte "Splash" des xxx.product-Dateieditors eine Vorlage (die ich selbst nie probiert habe). –

+0

@ greg-449 Das ist ein großartiges Feature. Schreckliche GUI-Unterstützung, aber tolle Funktion. Jetzt funktioniert es wie erwartet, danke. –

Antwort

0

Sie können eine Methode für den UI-Thread in IApplication # start (IApplicationContext) wie folgt aufrufen. Aber ich bin mir nicht sicher, ob das der richtige Weg ist.

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

Überprüfen Sie Ihre IApplication # Startmethode, möglicherweise finden Sie eine Methode erstellt Anzeige. – Zaphod

Verwandte Themen