Supportnet / Forum / Anwendungen(Java,C++...)
Java-ein zweites Fenster öffnen
Frage
Hallo an alle,
ich hab ein Problem bezüglich Java.
Habe eine Classe geschrieben, welche ein Fenster im BorderLayout öffnet. Dieses BorderLayout enthählt mitunter ein Button, welcher ein zweites Fenster öffnen soll. Dieses zweite Fenster ist eine schon Vorhandene Klasse.
Also: ich möchte dem Button "zweites Fenster öffnen" sagen, dass er eine andere Klasse (wo auch ein Frame im BorderLayout vorhanden ist) öffnen soll.
So, dass ich letzten endes zwei Fenster geöffnet habe UND, wenn ich das zweite Fenster schließe, sich das erste Fenster nicht gleich mit schließt.
Ich hoffe, die Beschreibung reicht euch aus.
Bitte helft mir, denn ich weiß nicht mehr weiter.
Danke im Vorraus und Grüße, Steffie
Antwort 1 von mr_x_hacker
Hi,
wie öffnest Du denn das erste Fenster? Irgendwo steht auf jeden Fall "setVisible(true)" - ich bevorzuge es z.B. im Konstruktor der Fenster-Klasse :-)
In diesem Fall erzeugst Du also in der actionPerformed() zum entsprechenden Button eine neue Instanz der zweiten Klasse, und das Fenster sollte aufgehen und auch unabh. vom ersten wieder geschlossen werden können.
Du kannst auch einfach einen neuen Frame anlegen, und diesen dann manuell mittels "frame.setVisible(true)" anzeigen lassen...
Soweit hat die Beschreibung gereicht - wenn's das nicht war, bitte genauer sagen was Du willst :-)
Ciao Sascha
wie öffnest Du denn das erste Fenster? Irgendwo steht auf jeden Fall "setVisible(true)" - ich bevorzuge es z.B. im Konstruktor der Fenster-Klasse :-)
In diesem Fall erzeugst Du also in der actionPerformed() zum entsprechenden Button eine neue Instanz der zweiten Klasse, und das Fenster sollte aufgehen und auch unabh. vom ersten wieder geschlossen werden können.
Du kannst auch einfach einen neuen Frame anlegen, und diesen dann manuell mittels "frame.setVisible(true)" anzeigen lassen...
Soweit hat die Beschreibung gereicht - wenn's das nicht war, bitte genauer sagen was Du willst :-)
Ciao Sascha
Antwort 2 von Steffie
Hallo, Du hast genau den Punkt getroffen, Danke dafür. Nur, eine Frage hab ich dazu noch (siehe am Schluss)
das erste Fenster öffne ich mit setVisible(true); dies steht auch im Konstruktor der Fenster-Klasse
1)Ich hab es so gelöst, aber das ist keine neue Instanz zu einer zweiten Klasse
2)in dieser Variante schließt sich das erste und das zweite Fenster.
3)in der actionPerformed() zum entsprechenden Button sthet
-->
Button neues_Fenster = new Button("öffnen");
. . .
. . .
. . .
public void actionPerformed(ActionEvent ae)
{
else if (ae.getSource() == neues_Fenster)
{
Frame wnd = new Frame("Fenster schließen");
wnd.addWindowListener(new WindowClosingAdapter(true));
wnd.setSize(400,300);
wnd.setVisible(true);
}
}
Jetzt meine Frage:
Wie erszeuge ich in der actionPerformed() zum entsprechenden Button eine neue Instanz der zweiten Klasse? Was muss ich dabei alles beachten, damit dies auch funktioniert? Also, muss ich noch zusätzlich zB. die zweite Klasse in die erste Klasse (mit extends oder import) einbinden?
wieder einmal Danke im Vorraus.
ciao Steffie
das erste Fenster öffne ich mit setVisible(true); dies steht auch im Konstruktor der Fenster-Klasse
1)Ich hab es so gelöst, aber das ist keine neue Instanz zu einer zweiten Klasse
2)in dieser Variante schließt sich das erste und das zweite Fenster.
3)in der actionPerformed() zum entsprechenden Button sthet
-->
Button neues_Fenster = new Button("öffnen");
. . .
. . .
. . .
public void actionPerformed(ActionEvent ae)
{
else if (ae.getSource() == neues_Fenster)
{
Frame wnd = new Frame("Fenster schließen");
wnd.addWindowListener(new WindowClosingAdapter(true));
wnd.setSize(400,300);
wnd.setVisible(true);
}
}
Jetzt meine Frage:
Wie erszeuge ich in der actionPerformed() zum entsprechenden Button eine neue Instanz der zweiten Klasse? Was muss ich dabei alles beachten, damit dies auch funktioniert? Also, muss ich noch zusätzlich zB. die zweite Klasse in die erste Klasse (mit extends oder import) einbinden?
wieder einmal Danke im Vorraus.
ciao Steffie
Antwort 3 von mr_x_hacker
Hi,
also zuerst mal:
WindowClosingAdapter(boolean) ist aber nix aus der Java-API, hmm?:-)
Wenn es das ist was ich in Google gefunden hab, dann führt es vermutlich automatisch einen System.exit() aus, wonach logischerweise alle Fenster zu sind...
Ansonsten ist Deine Methode wunderbar, sofern Dir diese Art der Frame-Erzeugung ausreicht - eine eigene Klasse für's 2te Frame muß nicht von der ersten abgeleitet sein, sofern sie nichts miteinander zu tun haben sollen...
Eigentlich muß Du nur den WindowListener des 2ten Frames überarbeiten, so dass er Dir nicht alles zumacht, sondern nur das 2te Fenster.
Beispiel:
Ciao Sascha
also zuerst mal:
WindowClosingAdapter(boolean) ist aber nix aus der Java-API, hmm?:-)
Wenn es das ist was ich in Google gefunden hab, dann führt es vermutlich automatisch einen System.exit() aus, wonach logischerweise alle Fenster zu sind...
Ansonsten ist Deine Methode wunderbar, sofern Dir diese Art der Frame-Erzeugung ausreicht - eine eigene Klasse für's 2te Frame muß nicht von der ersten abgeleitet sein, sofern sie nichts miteinander zu tun haben sollen...
Eigentlich muß Du nur den WindowListener des 2ten Frames überarbeiten, so dass er Dir nicht alles zumacht, sondern nur das 2te Fenster.
Beispiel:
wnd.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we) {
Frame f = (Frame)we.getSource();
f.dispose();
}
});
Ciao Sascha
Antwort 4 von semi
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
sollte ausreichen.
sollte ausreichen.
Antwort 5 von mr_x_hacker
Ja, bei JFrames schon - ich hab halt mal AWT unterstellt, nachdem in ihrem Beispiel-Code kein 'J' zu finden war... ;-)
Ciao Sascha
Ciao Sascha
Antwort 6 von Steffie
Hallo,
sorry ersteinmal für meine lange Abwesenheit und danke für die Unterstützung.
Das mit dem Schließen geht einwandfrei.
Ja, ich mach dies noch auf AWT-Basis. Aber @semi, danke für dein Tipp.
Aber nun zu dem Problem mit der zweiten Klasse (welche ein zweites Fenster öffnet). Diese soll aus der ersten Klasse gestartet werden.
else if (ae.getSource() == neues_Fenster)
{
Frame wnd = new Frame("Fenster schließen");
wnd.setSize(400,300);
wnd.setVisible(true);
wnd.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we)
{
Frame f = (Frame)we.getSource();
f.dispose();
}
});
}
Was muss zwischen der ersten und letzten eckigen Klammer rein, damit ich eine zweite Klasse (Name: Fenster2.java) öffnen kann?
Entschuldigt diese "Anfängerfragen" und ich freu mich auf eure Hilfe.
Gruß, Steffie
sorry ersteinmal für meine lange Abwesenheit und danke für die Unterstützung.
Das mit dem Schließen geht einwandfrei.
Ja, ich mach dies noch auf AWT-Basis. Aber @semi, danke für dein Tipp.
Aber nun zu dem Problem mit der zweiten Klasse (welche ein zweites Fenster öffnet). Diese soll aus der ersten Klasse gestartet werden.
else if (ae.getSource() == neues_Fenster)
{
Frame wnd = new Frame("Fenster schließen");
wnd.setSize(400,300);
wnd.setVisible(true);
wnd.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent we)
{
Frame f = (Frame)we.getSource();
f.dispose();
}
});
}
Was muss zwischen der ersten und letzten eckigen Klammer rein, damit ich eine zweite Klasse (Name: Fenster2.java) öffnen kann?
Entschuldigt diese "Anfängerfragen" und ich freu mich auf eure Hilfe.
Gruß, Steffie
Antwort 7 von Steffie
... noch etwas
muss diese zweite Klasse erst übersetzt werden, oder kann ich sie auch einbinden ohne dass ich sie extra übersetze?
muss diese zweite Klasse erst übersetzt werden, oder kann ich sie auch einbinden ohne dass ich sie extra übersetze?
Antwort 8 von mr_x_hacker
Hi,
wenn Du eine 2te Klasse Fenster2.java schon geschrieben hast, solltest Du an beliebiger Stelle (also z.B. in der actionPerformed) mittels
new Fenster2();
eine Instanz davon erzeugen können, die dann ensprechend sichtbar wird, wenn in deren Konstruktor setVisible(...) aufgerufen wird.
Übersetzen macht der Compiler automatisch wenn Du die erste Klasse übersetzt.
Ach ja, die Fenster2 sollte im gleichen Verzeichnis liegen wie die erste, sonst mußt Du sie importieren...
Ciao Sascha
wenn Du eine 2te Klasse Fenster2.java schon geschrieben hast, solltest Du an beliebiger Stelle (also z.B. in der actionPerformed) mittels
new Fenster2();
eine Instanz davon erzeugen können, die dann ensprechend sichtbar wird, wenn in deren Konstruktor setVisible(...) aufgerufen wird.
Übersetzen macht der Compiler automatisch wenn Du die erste Klasse übersetzt.
Ach ja, die Fenster2 sollte im gleichen Verzeichnis liegen wie die erste, sonst mußt Du sie importieren...
Ciao Sascha

