Programmierung:
Klasse A (mit main(String[] args)) öffnet eine Klasse B (extends JFrame).
Frage:
Wenn nun das Fenster (Klasse B) geschlossen wird, wird dann auch die Klasse (welcher meiner Meinung nach in einem eigenen Thread läuft?!?) auch "geschlossen"? Damit bleibt aber immer noch Klasse A offen. Wie kann ich diese einfach abschliessen?
Code:
Code:
public class A {
public static void main(String[] args) {
Fenster f = new Fenster();
f.draw();
}
}
class Fenster extends JFrame {
//**** variablen
....
//**** konstruktoren
public Fenster() {
mainFrame = new JFrame();
cp = mainFrame.getContentPane();
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent event) {
setVisible(false);
dispose();
System.exit(0);
}
}
);
}
}
//** function draw fehlt, aber die ist ja nicht das problem...
Vielen Dank für eine schnelle Antwort.
Gruss
Felix
Meiner Meinung nach sollte dies auch so sein, ist aber leider nicht so.
Wenn ich den Code mit jcreator (ide) ausführen lasse, wird das Programm nicht beendet. Im Taskmanager läuft ein Prozess weiter.
danke für weitere Hinweise.
Ausfürhbarer Code:
Code:
public class A {
public static void main(String[] args) {
Fenster f = new Fenster();
f.draw();
while (true) {
System.out.println("läuft noch...");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
}
}
/* nächste klasse */
import java.io.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
import java.awt.Graphics.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
import javax.swing.border.*;
import javax.imageio.*;
class Fenster extends JFrame {
//**** variablen
//** interne
JFrame mainFrame;
Container cp;
//**** konstruktoren
public Fenster() {
mainFrame = new JFrame();
cp = mainFrame.getContentPane();
mainFrame.setTitle("läuft noch ...");
mainFrame.setResizable(false);
addWindowListener(
new WindowAdapter() {
public void windowClosing(WindowEvent event) {
//fertig = true;
setVisible(false);
dispose();
System.exit(0);
}
}
);
}
//**** methoden
public void draw() {
// cp definitionen
cp.setLayout(null);
cp.setBackground(new Color(250,250,250));
mainFrame.setVisible(true);
}
}
Mach mal das #dispose weg, auch das #setVisible(false) ist überflüssig. Wenn du die Anwendung eh beendest, musst du dich auch nicht mehr mit dem Schließen von Fenstern und dem Aufräumen von Objektmüll beschäftigen. Ohne es ausgetestet zu haben würde eine "ausgewachsene" IDE oder ein entsprechendes Plugin dir deinen System.exit(0) wahrscheinlich als "unreachable code" per Warning markieren, da Code nach #dispose nicht mehr ausgeführt wird.
doch klar wird der noch ausgeführt :autsch: ne "unreachable code" meldung ist außerdem ein compilerfehler und wird nur bei code hinter returns oder breaks ausgegeben.
und wenn du sonen code hast:
Klar finde ich das eigentlich weniger, da System#exit die VM beenden sollte:
"Terminates the currently running Java Virtual Machine. The argument serves as a status code; by convention, a nonzero status code indicates abnormal termination."
Und wenn die VM beendet ist, kann da nix mehr laufen, auch wenn ich 20.000 Threads habe.
tja...
debuggen gibts nur im pro modus... (auf der suche nach einer neuen ide...) soviel zum zweitletzten antwort.
zur letzten: wenn system.exit() aufgerufen wurde, sollte doch alles beendet werden? dann würde die schleife auch keine rolle spielen, oder?
ich habe, das gefühl, beim schliessen des fensters (aufs rote x) wird der event gar nicht an den Listener weitergereicht?!?
danke nochmals für das interesse.
Ich sagte auch, dass ich es nur vermute und nicht getestet habe
Ich persönlich würde nicht auf die Idee kommen nach #dispose nicht irgendeinen Code zu stecken.