PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : fenster schließt nicht ..



pucki
14-02-2008, 21:18
hi,

vor einigen Jahren hatte ich mal kurz etwas mit Java zu tun. Nun bin ich gerade dabei ein wenig damit herumzuspielen.

Das Codebeispiel soll ein Fenster erstellen, dass durch ein Klick auf das Feld "x" sich wieder schliessen läßt.



import javax.swing.*;

public class Test {
public static void main (String args[]) {
JFrame F=new JFrame("Test Frame");
F.setSize(300,300);
F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
F.setVisible(true);
// System.exit(0);
}
}

leider will das aber nicht so ...
Es kommt keine Fehlermeldung, Warnung oder ähnliches. Mit "System.exit(0);" wird das ganze ordentlich beendet, aber das Fenster wartet natürlich nicht bis ich es schliesse ;-).

grüße

Reinhard

BlueJay
15-02-2008, 07:36
Das war nur die halbe Miete. Du musst dem Ehemann, äh, dem Java sagen, dass es das Fenster zumachen soll, wenn er geht:


frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOS E);

Näheres dazu hier:
http://java.sun.com/j2se/1.3/docs/api/javax/swing/JFrame.html

so long,
BlueJay

pucki
15-02-2008, 12:34
hi BlueJay,

mmmhh finde ich ein wenig dürftig die info, fast so schlimm wie meine ;-).
Laut Doku wird bei der Swing Klasse der Eventhandler automatisch gestartet, bei der awt - Klasse nicht. Das heißt es müsste reichen dem Handler zu sagen was er machen soll. Das ganze übernimmt imho die Funktion :

F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

da hilft mir auch der Verweiss in die Doku von 1.3 nicht viel, da ich das problem mit dem gcj 1.5, aber nicht mit der jdk von sun habe. Die Lösung war in diesem Fall für
die console: umbiegen der Pfade in /etc/alternativ/

bzw. in eclipse das hinzufügen der jre von sun

das ganze funktioniert also erst mal, ist aber imho ziemlich unbefriedigend ...
wenn also jemand noch zufällig ein paar weitergehende infos hat oder noch ein paar Details zu BlueJay's info hinzufügt, dass ich das ganze auch verstehe ;-)

grüße

Reinhard

BlueJay
15-02-2008, 17:38
Oh, sorry, bei "import javax.swing" habe ich in meiner Beschränktheit doch glatt angenommen, dass du mit dieser Bibliothek arbeiten wolltest. Dann hätte der Einzeiler als Ergänzung voll gereicht, und der Link war noch ein bisschen zum Schmökern.

Zum GCJ fragst du aber am besten peschmae, ich weiss nur, dass die wohl das mit dem awt, geschweige denn swing, nicht auf die Reihe kriegen.

pucki
15-02-2008, 18:05
hi,

jetzt müßte ich dich ein wenig mehr kennen um mit dem ersten Abschnitt etwas besser klar kömmen zu können ;-), imho hatte ich den einzeiler doch drin????

Oh, sorry, bei "import javax.swing" habe ich in meiner Beschränktheit doch glatt angenommen, dass du mit dieser Bibliothek arbeiten wolltest. Dann hätte der Einzeiler als Ergänzung voll gereicht, und der Link war noch ein bisschen zum Schmökern.

Zum GCJ fragst du aber am besten peschmae, ich weiss nur, dass die wohl das mit dem awt, geschweige denn swing, nicht auf die Reihe kriegen.

gut das ist ne info ;-) mal schauen ob er hier von alleine mal vorbeischaut oder ob ich es erst mal darauf beruhen lasse, dass ich jetzt weiss, wen ich nerven kann, wenn mir mal wieder etwas spanisch vor kommt ;-)

grüße

peschmae
15-02-2008, 22:10
Also GCJ 1.5 gibts nicht wirklich. ;)

Habs mal schnell durch GCJ 4.3 gelassen (der Debiansche CVS Snapshot vom 2.2.08). Da tritt dein Problem auch auf.

Was aber weiterhin funktioniert ist die Alternativvariante aus den grauen Vorzeiten, als es noch kein Java 1.3 gab:


import javax.swing.*;
import java.awt.event.*;

public class Test {
public static void main (String args[]) {
JFrame F=new JFrame("Test Frame");
F.setSize(300,300);
F.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
F.setVisible(true);
}
}


Dein Beispiel illustriert ganz gut wie man auch heute noch vorgehen muss, wenn man ein Java-Programm schreiben will das mit Classpath (den auch GCJ verwendet) kompatibel ist:
Nicht erst das Programm unter der Verwendung von Sun-Java schreiben und erwarten dass dann einfach alles gleich läuft. Sondern vielmehr und besser das Programm unter Verwendung von Classpath schreiben und testen; dann läufts fast garantiert auch mit Suns Java problemlos.

Mittelfristig ist allerdings durchaus Hoffnung vorhanden - dank Suns GPL-Freigabe grosser Teile der Klassenbibliothek und Projekten wie IcedTea... - aber das dauert halt ein Weilchen. Ist ja auch gross, die Bibliothek.

MfG Peschmä

pucki
16-02-2008, 10:57
Hi,


Also GCJ 1.5 gibts nicht wirklich. ;)

Habs mal schnell durch GCJ 4.3 gelassen (der Debiansche CVS Snapshot vom 2.2.08). Da tritt dein Problem auch auf.

jup die Formulierung war alles andere als zutreffend ;-)
und bei mir ist der gcj 4.3 installiert ..




Was aber weiterhin funktioniert ist die Alternativvariante aus den grauen Vorzeiten, als es noch kein Java 1.3 gab:


import javax.swing.*;
import java.awt.event.*;

public class Test {
public static void main (String args[]) {
JFrame F=new JFrame("Test Frame");
F.setSize(300,300);
F.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
F.setVisible(true);
}
}


Danke für das Beispiel. Also einfach nicht davon ausgehen, dass JFrame den Handler automatisch hinzufügt ...




Dein Beispiel illustriert ganz gut wie man auch heute noch vorgehen muss, wenn man ein Java-Programm schreiben will das mit Classpath (den auch GCJ verwendet) kompatibel ist:
Nicht erst das Programm unter der Verwendung von Sun-Java schreiben und erwarten dass dann einfach alles gleich läuft. Sondern vielmehr und besser das Programm unter Verwendung von Classpath schreiben und testen; dann läufts fast garantiert auch mit Suns Java problemlos.

Mittelfristig ist allerdings durchaus Hoffnung vorhanden - dank Suns GPL-Freigabe grosser Teile der Klassenbibliothek und Projekten wie IcedTea... - aber das dauert halt ein Weilchen. Ist ja auch gross, die Bibliothek.

MfG Peschmä

mmm ein paar Sachen muss ich mir mal wohl erst noch aneignen ... Aber gut ich weiss jetzt dass ich diesbezüglich einfach immer wieder mal mit Problemen zu rechnen habe. Alles weitere ergibt sich dann.

Grüße und Danke

peschmae
16-02-2008, 11:18
Also einfach nicht davon ausgehen, dass JFrame den Handler automatisch hinzufügt ...


Automatisch tuts das sowieso nicht ;)
Du musst ja auch bei Sun ein
F.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); einfügen. Ist halt nur dass bei der Classpath-Version die bei GCJ 4.3 dabei ist offenbar die F.setDefaultCloseOperation-Methode nicht implementiert ist.

Was mich allerdings doch etwas verwundert. Sonderlich schwer ist die ja nicht zu erstellen und benutzt wird sie doch recht oft. Naja ;)

MfG Peschmä

BlueJay
16-02-2008, 16:39
hi,
jetzt müßte ich dich ein wenig mehr kennen um mit dem ersten Abschnitt etwas besser klar kömmen zu können ;-), imho hatte ich den einzeiler doch drin????


Konqueror spielt mir cachemäßig schon mal einen Streich:
In der Version, die ich gestern zu Gesicht bekam, war sie nicht drin, und das System.exit(0) war aktiv. Von daher lief alles, wie erwartet.

IMHO gehört beides rein.

Und von den Java-Versionen kenne ich nur Sun und blackdown.