# Programm schließen und wieder neu starten



## Meru (16. Mai 2008)

Hallo

Ich habe ein proggi wo sich Benutzer anmelden müssen um es zu nutzen. Beim start der Anwendung erscheint ein Einlogfensterchen. Benutzer sollen sich aber auch aus dem System ausloggen können. Ich hätte es gern, dass wenn sich der Benutzer ausloggt, die komplette Clientanwendung schließt (Bsp system.exit()) und danach automatisch sich neu startet.

Ein wenig hab ich schon rumprobiert. Zum beispiel das ich mein aktuelles JFrame einfach ausblende und den Hauptkonstruktor (main) einfach nochmal ausführe. Ist zwar nicht elegant, aber es funktionierte prinzipiell wie ich wollte.
Nun erzeuge ich innerhalb meiner Applikation irgendwo ein JDialog (nicht modales fenster). Wenn ich mich nun mit der oben genannten Methode ausloggen will, geht zwar das JFrame zu, aber der Dialog bleibt offen. Ist ja auch klar, das dies so ist.

Nun ist meine Frage, wie kann ich alle Instanzen des Programmes wirklich aus der VM nehmen und automatisch eine neue Instanz der Clientanwendung starten?


----------



## thE_29 (16. Mai 2008)

Die einzig (mir bislang) relativ gute Methode ist es mit Hilfe eines Startes zu implementieren!

Dh, entweder eine executeable für das jeweilige System oder eine bat/sh Datei!

In der prüfst du den exit Wert ab!

zB in Windows gehts so:
starter.bat


> @echo off
> :start
> java -jar DeinProgram.jar
> if  %errorlevel% neq 2 goto start



Solange dein Programm nicht mit System.exit(2) beendet wird, startet es automatisch neu! Willst du es endgültig beenden, dann beende mit Code 2! Oder lass die Abfrage weg und mach immer ein goto start!

Alles andere kann manchmal zu Problemen führen (in einem extra Thread nochmals starten, etc..) da manchmal der neue Prozess vom alten mit in den Tod gerissen wird!


----------



## Meru (16. Mai 2008)

Ansich schon eine gute Lösung, aber leider plattformabhängig. Danke dennoch für den Tip, kannte ich so noch nicht


----------



## thE_29 (16. Mai 2008)

Naja, wie gesagt!

Eine sh Datei die das gleiche macht, ist schnell gemacht! Ansonsten gibt es nicht wirklich etwas gutes!

Du könntest ein 2tes Jar Programm beim Beenden starten, was wartet bis dein Hauptprogramm beendet ist und dieses nochmals starten. Dann müsste alles rausgeladen sein. (Und die java Umgebung kriegst du über Variablen aus System.getProperty())


----------



## Meru (16. Mai 2008)

Oh, das SH hab ich wohl falsch gedeutet ^^.
Aber die Syntax ist doch unter Linux anders als die unter windows? Aber gut, da könnte ich 2 varianten anbieten. Ich werd das mal am Wochenende testen


----------



## MQue (16. Mai 2008)

thE_29 hat gesagt.:
			
		

> zB in Windows gehts so:
> starter.bat
> 
> 
> ...



Das heißt quasi, dass die bat datei die jar ausführt und wenn mit System.exit(2) das Java- programm beendet wird, dann wird dieser Wert (2) an die bat- Datei zurückgeliefert??

:start ist nur ein Label, oder?
 und was ist errorlabel und neq??


----------



## The_S (16. Mai 2008)

Warum nicht einfach das Programm nochmal über die Runtime ausführen (neue VM-Instanz) und anschließend beenden?


----------



## thE_29 (16. Mai 2008)

Jop!
Der Wert bei System.exit wird an die Bat Datei zurückgeliefert!

Das ist der return Wert der Anwendung. In Linux fragste den mit $? ab.
und in Windows mit %errorlevel%
Und das ist halt einfach ein if:

if returnwert not equals 2 gehe zum start


@Hobbit: Die Frage ist ja, ob das Programm 2mal gestartet werden darf/soll. Bei mir war das nicht der Fall! Daher musste ich es vorher sauber beenden.


----------



## Escorter (16. Mai 2008)

Anstatt es über ein Batch Datei zu machen, kann man doch ebstimmt auch über Process, den Rückgabewert abfagen.

Ein kleines programm schreiben, dass das Hauptprogramm startet, wenn der Rückgabewert kommt. Startet es das Hauptprogramm erneut.

Gruß,
Esco


----------



## thE_29 (18. Mai 2008)

Habe ich bereits erwähnt 

Habe halt executable dazu gesag! Und dort kriegt man den return Wert auch ganz leicht und der Code ist nicht mal schwer


----------

