# Kontrolliertes Beenden einer Application



## dzim (24. Nov 2009)

Ok, der Titel mag jetzt vielleicht ein wenig irreführen, daher hier meine Erklärung:
Ich lasse über einen SplashHandler (siehe http://www.java-forum.org/plattformprogrammierung/91965-preferences.html ) einen Dialog öffnen. Drückt man im Dialog "Cancel" soll die Anwendung geschlossen werden.

Klar könnte ich jetzt System.exit(0); oder so aufrufen, aber ist das nicht etwas zu heftig? Gibt es da noch einen anderen Weg, oder ist das der Einzige?


----------



## L-ectron-X (24. Nov 2009)

Meinst du so etwas? Bestätigung vor Programmende (Java) - Byte-Welt Wiki


----------



## André Uhres (24. Nov 2009)

dzim hat gesagt.:


> Klar könnte ich jetzt System.exit(0); oder so aufrufen, aber ist das nicht etwas zu heftig?


Ja, allgemein ist System.exit(0) zu heftig. Ich würde daher eher mit dispose() arbeiten. Die Anwendung wird dann ebenfalls geschlossen, aber nur wenn kein anderes Fenster mehr geöffnet ist.


----------



## Koringar (25. Nov 2009)

Hi,

wenn du die Komplette Anwendung beenden willst gibt es auch über die PlatformUI:

```
PlatformUI.getWorkbench().getActiveWorkbenchWindow().close();
```


----------



## dzim (25. Nov 2009)

Ah ok, das war das was ich suchte!

ich musste es nur noch minimal anpassen:

```
PlatformUI.getWorkbench().close();
```

Zur Splash-Screen-Zeit existiert augenscheinlich noch kein ActiveWorkbenchWindow - das führt dann nur zu einer NPE.
Mit o.g. Anweisung beendet sich das Programm dann.

edit: Es gibt immer noch eine NPE... Ich war wohl zu voreilig! Mist!


----------



## Koringar (25. Nov 2009)

Wie zur SplashScrenn Zeit?? Wo oder wann rufste denn dein Dialog auf?


----------



## dzim (25. Nov 2009)

Ähm - zur Splash-Screen-Zeit!?

Es gibt doch den ExtensionPoint org.eclipse.ui.splashHandlers um eigenes Verhalten in den SplashScreen zu legen (Login, etc.) und da man dort eine Shell bekommt, kann man auch Dialoge öffnen (siehe Eclipse: Workspace-Auswahl-Dialog, der - solange man es zulässt - immer kommt, wenn man Eclipse startet - und zwar, wenn der Splash-Screen angezeigt wird und noch *bevor* eine Workbench angelegt wird).


----------



## dzim (25. Nov 2009)

Ok - Kreuzigt und Steinigt mich meinetwegen, aber ich hab es jetzt genau wie die Eclipse-Entwickler gemacht:
Ich nutze keinen splashHandler mehr, sondern mache meinen Mist programmatisch in der Application-Klasse im start - ich gebe einfach beim Druck auf "Cancel" IApplication.EXIT_OK zurück und die Anwendung beendet sich...

Ich versteh aber nicht, das es da keinen vernünfitgen Weg über die Platform gibt - in der Form macht doch der SplashHandler dann fast keinen Sinn, wenn man so etwas wie ich umsetzen möchte...

BTW: Meine Start-Methode in der App sieht jetzt wie folgt aus

```
public Object start(IApplicationContext context) {
	Display display = PlatformUI.createDisplay();
	try {
		if (SSDToolUtils.isShowWorkspaceSelectionDialog()) {	// lookup for the preferences
			OpenSSDToolWorkpaceDialog dialog = new OpenSSDToolWorkpaceDialog(
					display.getActiveShell());				// my dialog, shown during startup

			if (dialog.open() == TitleAreaDialog.CANCEL) {
				return IApplication.EXIT_OK;				// on cancel, exit application
			}
		}

		// original generated code
		int returnCode = PlatformUI.createAndRunWorkbench(display,
				new ApplicationWorkbenchAdvisor());
		if (returnCode == PlatformUI.RETURN_RESTART) {
			return IApplication.EXIT_RESTART;
		}
		return IApplication.EXIT_OK;
	} finally {
		display.dispose();
	}
}
```


----------

