# Programm beenden



## muck1980 (5. Mrz 2008)

Hallo,

ich habe ein Problem mit dem Beenden bzw. dem nicht-beenden eines Programms, was aus einer GUI aufgerufen wird.

Folgendes Szenario:

Wenn ich einen Button drücke, soll ein Programm ausgeführt werden. Ich nenne es mal "Transformation".
Wenn das Programm abgeschlossen ist, möchte, dass es beendet wird, die GUI soll dabei nicht beendet werden.
Deshalb fallen so schöne Sachen wie "System.exit(n)" weg.
Mein Problem an der Sache ist, dass das Programm anscheinend nicht beendet wird und somit verschiedene Variablen in dem Program nicht in ihren Ursprungzustand zurückgesetzt werden. Deshalb kann ich immer nur eine transformation durchführen und muss dann die GUI wieder neu starten, um keinen Fehler bei der Transformation zu erhalten.
Momentan sieht mein Code folgendermaßen aus (Ausschnitt:

```
...
ActionListener al = new ActionListener() {
				public void actionPerformed( ActionEvent e ) {
				if(e.getActionCommand().equalsIgnoreCase("Start transformation")){
					.......
					JOptionPane.showMessageDialog(GUIMain.jp,
					"You have choosen the File: "+ "\"" + tfXXX.getText() + "\"" + "!\n");

						if (rb1.isSelected()){
							engine = "YYY";
						}
						else if (rb2.isSelected()){
							engine = "ZZZZ";
						}
// Hier wird die Methode aufgerufen, die die Transformation durchführt
						i.run(tfXXX.getText(), engine);
					}
					}
				}
			};	
...
```
Gibt es eine Möglichkeit der Programm zu beenden ohne die GUI dabei mit zu beenden?

Grüße
muck


----------



## Wildcard (5. Mrz 2008)

Die GUI ist Teil des Programms.


----------



## muck1980 (6. Mrz 2008)

Danke für die Antwort, aber was sagt mir das denn jetzt???

Grüße
muck


----------



## Wildcard (6. Mrz 2008)

Das du ein Progamm nicht partiell beenden kannst.



> Deshalb kann ich immer nur eine transformation durchführen und muss dann die GUI wieder neu starten, um keinen Fehler bei der Transformation zu erhalten.


Dann musst du eben alle Zustände wieder in den Ursprungszustand versetzen.


----------



## Gast (6. Mrz 2008)

Kann er nicht ein neues Fenster öffnen? Komisch, ich kann aus nem JFrame ein JFrame raus aufmachen. Wenn ich das will sogar in nem neuen Thread. Sogar als neue Instanz. Und wenn ichs ganz hart will kann ichs auf Windowssystemen auch über Runtime.Exec machen. *angeb* 

Und du kannst das auch! *motivier*

Man müsst halt mehr wissen. Läuft das Programm in nem eigenen Fenster (JFrame, ...)? Oder im Hintergrund (Dann verstünde ich das Problem nicht)? Und was ist i.run() (Könnt ein Runnable sein?)?


----------



## Quaxli (6. Mrz 2008)

Klar kann man das machen. Ich kann auch aus dem Fenster springen, wenn ich will....

Man kann auch einfach eine Methode aufrufen, die alle Variablen wieder initialisiert, so wie von Wildcard vorgeschlagen. Das ist eigentlich die übliche Vorgehensweise.


----------



## Gast (6. Mrz 2008)

Du willst mir jetzt allen Ernstes sagen das seperate, in einem eigenen Thread laufende Programme keinen Sinn haben? Dann versteh ich denn Sinn von Runnable nicht...


----------



## Guest (6. Mrz 2008)

Das i.run() ist kein Runnable (zumindest nicht mehr   ) hatte vorher mal ein bisschen mit Threads rumprobiert, aber das klappte auch nicht.

Im Endeffekt ist es so, dass ich erst mein Programm geschrieben und dann einfach in dem gleichen Projekt ne GUI da drüber gebaut habe. 

Ich versteh das Problem selbst nicht so wirklich. Dachte eigentlich, dass nach beenden der Methode i.run(), die eben auch beendet ist und alles auf Ursprung gesetzt wird.  Dem ist aber anscheinend nicht so. Ich habe in dem Programm einige counter usw. drin und da die nicht auf null zurückgesetzt werden bekomme ich bei mehrmaligem Durchaluf Fehlermeldungen wie ArrayIndexOutOfBounds usw.

Gibt es ne Standard-Methode mit der ich alle Variablen in den Ursprungszustand versetze oder muss ich die alle händisch zurücksetzen?

Danke für die Anregungen!!!


----------



## Quaxli (7. Mrz 2008)

Woher soll die JVM wissen, daß Du eine Variable demnächst wieder leer benötigst? Nein, Du must die schon händisch zurück setzen. Und natürlich haben Programmteile, die in einem eigenen Thread laufen, ihren Sinn. Aber ich verstehe Dein Problem so langsam nicht mehr. Wenn es ein eigener Thread wäre, wäre doch alles erledigt, sobald die Methoden des Objektes abgearbeitet sind und nicht mehr "benutzt" werden.
Ich habe den Eindruck, daß es sich eher um ein konzeptionelles Problem handelt. Beschreibe doch mal, was Dein Programm macht / machen soll und und wie Du es konzipiert hast.


----------



## Gast (7. Mrz 2008)

Und Quellcode wär hilfreich. Mach dir am besten mal ein KSKB (kleines selbstständig kompilierbares Beispiel), das genau dein Problem wiedergibt. (Halt ein Rohbau mit einem Counter drin.) Anhand von sowas können wir dir auch besser helfen ein sauberes Konzept zu erstellen.


----------



## muck1980 (8. Mrz 2008)

Habs hingekriegt.   
Es lag nicht nur daran, dass ich die Variablen neu initialisieren musste. Da ich Singletons verwende, wurden die Vectoren usw. in den jeweiligen Klassen nicht zurückgesetzt. Das musste ich noch händisch nachtragen.

Danke für die Tipps. Insbesondere mit der Neu-Initialisierung der Varaiblen.

grüße
muck


----------

