Hallo,
ich hab ein Problem mit Multithreading - ich will, dass bei einer Shutdown Methode noch verschiedene Dinge erledigt werden, die Zeit in Anspruch nehmen. Damit der User nicht vom Warten genervt wird - soll in der Statusleiste geschrieben werden, was gerade gemacht wird. Leider funktioniert es nicht so wie ich es gemacht habe:
Meinem JFrame habe ich folgenden WindowListener angehängt:
Die Klasse SetStatusBar sieht folgendermaßen aus:
Ich weiß auch schon (glaube ich zumindest) warum es nicht funktioniert. Der EventDispatcherThread arbeitet ja nacheinander die Events ab. Da er aktuell das Event WindowClosing abarbeitet, kommen die Events die mit invokeAndWait hinten dran eingefügt werden eben erst dran, wenn WindowClosing fertig ist. Und dadurch sieht man eben so lange nix in der Statusleiste bis WindowClosing fertig ist - im Endeffekt sieht man dann gar keine Änderung, denn der JFrame wird ja am Schluss mit dispose geschlossen.
Frage: Wie würdet ihr mein Problem beheben bzw. welche Lösung würdet ihr vorschlagen - wichtig ist dabei aber, dass der JFrame erst verschwindet wenn alle Arbeiten erledigt wurden. Und zwischen den Arbeiten soll eben der Status auf der Statusleiste in einem JLabel ausgegeben werden.
ich hab ein Problem mit Multithreading - ich will, dass bei einer Shutdown Methode noch verschiedene Dinge erledigt werden, die Zeit in Anspruch nehmen. Damit der User nicht vom Warten genervt wird - soll in der Statusleiste geschrieben werden, was gerade gemacht wird. Leider funktioniert es nicht so wie ich es gemacht habe:
Meinem JFrame habe ich folgenden WindowListener angehängt:
Code:
frame.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
new SetStatusBar("Beenden wird eingeleitet ...");
//Hier steht nen Haufen Code - also was alles gemacht werden muss
//Zwischen dem ganzen "Arbeits"-Code steht immer wieder folgender Aufruf
new SetStatusBar("Mache gerade folgendes ...");
//Zum Schluss kommt folgender Aufruf, der den JFrame und das Programm beenden soll
frame.dispose();
}
});
Die Klasse SetStatusBar sieht folgendermaßen aus:
Code:
public class SetStatusBar extends Thread {
private final String text;
public SetStatusBar(String text) {
this.text = text;
this.start();
}
public void run() {
try{
SwingUtilities.invokeAndWait( new Runnable(){
public void run() {
System.out.println("STATUSBARTEXT RUNNABLE: " + text);
Gui.INSTANCE.statusBar.setText(text);
}
});
}
catch( Exception e ){
}
}
}
Ich weiß auch schon (glaube ich zumindest) warum es nicht funktioniert. Der EventDispatcherThread arbeitet ja nacheinander die Events ab. Da er aktuell das Event WindowClosing abarbeitet, kommen die Events die mit invokeAndWait hinten dran eingefügt werden eben erst dran, wenn WindowClosing fertig ist. Und dadurch sieht man eben so lange nix in der Statusleiste bis WindowClosing fertig ist - im Endeffekt sieht man dann gar keine Änderung, denn der JFrame wird ja am Schluss mit dispose geschlossen.
Frage: Wie würdet ihr mein Problem beheben bzw. welche Lösung würdet ihr vorschlagen - wichtig ist dabei aber, dass der JFrame erst verschwindet wenn alle Arbeiten erledigt wurden. Und zwischen den Arbeiten soll eben der Status auf der Statusleiste in einem JLabel ausgegeben werden.