AWT WindowClosing wird nicht aufgerufen

mlcp

Mitglied
Hallo,

folgender Code soll mein Programm beenden:

Java:
import java.awt.*;
import java.awt.event.*;

public class Shutdown extends Frame implements WindowListener{

	private Thread mainthread;

	public Shutdown(){
		super();
		setVisible(true);
		setSize(100,100);
		mainthread = Thread.currentThread();
		addWindowListener(this);
	}
	
	
	public void windowClosing(WindowEvent e){
		Test.running = false;
		removeWindowListener(this);
		try{mainthread.join(5000);}//wait for main thread
		catch(InterruptedException ex){}
		dispose();
		System.exit(0);
	}

	public void windowDeactivated(WindowEvent e) {}
        public void windowActivated(WindowEvent e) {}
	public void windowClosed(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}
}

Funktioniert auch beim normalen beenden. Aber wenn ich Windows herunterfahre oder mich abmelde läuft das Programm weiter und reagiert nicht mehr. Was mache ich falsch?
 
Danke, aber funktioniert leider auch nicht.

Java:
import java.awt.*;
import java.awt.event.*;

public class Shutdown extends Frame implements WindowListener{
		
	Thread mainthread;
	
	public Shutdown(){
		super();
		setVisible(true);
		setSize(100,100);
		mainthread = Thread.currentThread();
		addWindowListener(this);
		Runtime.getRuntime().addShutdownHook( new Thread() { 
  		@Override public void run() { 
    		Test.running = false;
			try{mainthread.join(5000);}//wait for main thread
			catch(InterruptedException ex){}
			dispose();
			System.exit(0);
  			} 
		} ); 
	}
	
	
	public void windowClosing(WindowEvent e){
		Test.running = false;
		removeWindowListener(this);
		try{mainthread.join(5000);}//wait for main thread
		catch(InterruptedException ex){}
		dispose();
		System.exit(0);
	}

	public void windowDeactivated(WindowEvent e) {}
    public void windowActivated(WindowEvent e) {}
	public void windowClosed(WindowEvent e) {}
	public void windowIconified(WindowEvent e) {}
	public void windowDeiconified(WindowEvent e) {}
	public void windowOpened(WindowEvent e) {}
}

Edit: Mußte grad feststellen das es auch eine Frage der Java Version ist. Mit Java 6 hängt das Programm, mit Java 7 wird es sofort brutal beendet. Da bleibt bei den Logdateien sogar noch die .lck übrig.
 
Zuletzt bearbeitet:
wird der ShutdownHook überhaupt ausgeführt? teste mit System.out.println() bzw. schnell in eine Datei schreiben + close(),
bis zu 5 sec zu warten ist ja recht luxuriös

allgemeiner Hinweis: besser nicht Code kopieren, und seien es auch nur 6 Zeilen,
schreibe eine Methode workAtEnd(); und rufe sie vom ShutdownHook sowie vom WindowListener aus auf
 
Hab ich schon gemacht, beim "normalen" Beenden wird der ShutdownHook ausgeführt, wenn ich mich vom Windows abmelde nicht. 5 Sekunden brauch ich eigentlich nicht, hab ich nur zur Sicherheit so hoch gesetzt. Die workAtEnd() Methode ist eine gute Idee, werde ich machen.
 

Neue Themen


Zurück
Oben