# Programm per Klick neustarten ?



## Frankster (5. Oktober 2005)

Hi!

Nachdem man die config Datei verändert hat und auf den OK Button geklickt hat, soll das Programm einen Neustart machen.

Ich hab schon gegoogelt, aber wenn man neustart java eingibt, dann kommt eigentlich ziemlich viel, aber nichts was mir hilft :-(

Mfg
Frankster


----------



## schnuffie (6. Oktober 2005)

```
public void actionPerformed(ActionEvent ae) {
  if (ae.getActionCommand().equals("OK")) {
	//ggf. Fenster schließen (Programmfenster natürlich)
	MyMainKlasse.main(null); //ggf. Parameter mitgeben
  }
}
```
Etwas hart, aber so geht's.


----------



## matdacat (6. Oktober 2005)

Hm, wird so nicht nur eine neue Instanz des Programms gestartet? Du wirst die ursprüngliche Instanz noch beenden müssen.


----------



## Frankster (6. Oktober 2005)

wie geht das ?


----------



## matdacat (7. Oktober 2005)

Habs nicht ausprobiert, aber so sollte das funktionieren.


```
MyMainKlasse.main(null); // neue Instanz des Programms kreieren
myFrame.setVisible(false); // Fenster ausblenden
myFrame.dispose(); // Ressourcen freigeben
System.exit(0); // Programm beenden
```


----------



## schnuffie (7. Oktober 2005)

Genau, vorher kommt noch System.exit(0); ---> zu dumm nur, daß der Thread dann nicht mehr in der Lage ist, die main-Methode auszuführen.  


Bleibt Dir nur, einen neuen Thread starten, der die main-Methode aufruft und im Programmcode danach vom "alten" Thread System.exit(0) ausführen lassen.


----------



## torsch2711 (7. Oktober 2005)

Hmm, aber mit System.exit(0) schiesst du dir die komplette Java VM weg.

  Sprich es wird nichts weiter gemacht.

 Ich finde es auch nicht elegant gelöst wenn das ganze programm neu gestartet werden muss, wenn die config geändert wurde.


----------



## Thomas Darimont (7. Oktober 2005)

Hallo!

 Ich denke auch, dass System.exit(...) keine so gute Idee ist ;-)
 wie wär's denn damit?

```
/**
  * 
  */
 package de.tutorials;
 
 import java.awt.BorderLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.lang.reflect.Field;
 import java.util.ResourceBundle;
 
 import javax.swing.JButton;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 
 import sun.misc.SoftCache;
 
 /**
  * @author daritho
  * 
  */
 public class RestartableApplicationExample extends JFrame {
 
 	private static boolean restart = true;
 
 	public RestartableApplicationExample() {
 		super("RestartableApplicationExample");
 		setDefaultCloseOperation(EXIT_ON_CLOSE);
 
 		//Kleiner Hack um das Caching der ResourceBundle-Werte auszuschalten...
 		try {
 			Field field = ResourceBundle.class.getDeclaredField("cacheList");
 			field.setAccessible(true);
 			SoftCache softCache = (SoftCache) field.get(null);
 			softCache.clear();
 		} catch (Exception e) {
 			e.printStackTrace();
 			throw new RuntimeException(e);
 		}
 		ResourceBundle bundle = ResourceBundle
 		        .getBundle("de.tutorials.RestartableApplicationExample");
 
 		String text = bundle.getString("label.text");
 		JLabel label = new JLabel(text);
 
 		JButton button = new JButton("restart");
 		button.addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
 				restart = true;
 				dispose();
 			}
 		});
 
 		add(label, BorderLayout.CENTER);
 		add(button, BorderLayout.EAST);
 
 		pack();
 		setVisible(true);
 	}
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) throws Exception {
 		while (true) {
 			if (restart) {
 				new RestartableApplicationExample();
 				restart = false;
 			} else {
 				Thread.sleep(1000L);
 			}
 		}
 	}
 }
```
 
 Das Properties File RestartableApplicationExample.properties liegt im Verzeichnis de/tutorials.


```
label.text=fart
```
 
 Wird der Text in RestartableApplicationExample.properties nach dem Start geändert und anschließend restart angeklickt, so wird die Anwendung mit den neuen Daten aus dem Properties File "gestartet".

 Gruß Tom


----------

