Java Fenster-wechsel?

4 Antworten

Mach es so:

import javax.swing.JFrame

public class ReOpeningFrame extends JFrame {
public static void main(String[] args) {
new ReOpeningFrame();
} //hier haben wir in der main-methode ein erstes Fenster geöffnet

public ReOpeningFrame() {
JButton openNew = new JButton("ein neues Fenster");
openNew.addActionListener(new ActionLister() {
@Override
public void actionPerformed(ActionEvent event) {
this.setVisible(false);
new ReOpeningFrame(); //wenn der Button gedrückt wird, ein neues öfne
}
} //mal eben einen neuen Listener geschrieben und seine
//ActionPerformed Methode überschrieben
this.add(openNew);
this.setVisible(true);
}
}

Das sollte an sich funktionieren, auch wenn ich es nicht getestet habe. Das wirklich interessante Problem an dieser Stelle ist die Speicherverwaltung. Und zwar: du machst die alten Fenster nur unsichtbar. Wenn du sie wirklich löschen wollen würdest, musst du dich mit Futures und ThreadHandling herumschlagen, weil du dann alles von außerhalb der Fenster managen musst. Aber für den normalen Gebrauch sollte das reichen.

Übrigens: das funktioniert immer wieder: du kannst im neuen noch mal klicken und kriegst noch ein neues etc.

Ich glaube, dein eigentliches Problem ist folgendes: du kriegst das Alte nicht aus dem neuen heraus gelöscht. Geht auch nicht, jedenfalls nicht, ohne das dein Programm "broken by design" wird.

Das bessere wäre: Eine Klasse erstellen, die alles kontrolliert, den sogenannten Controller. Der muss eine innere Klasse haben, die den ActionListener implementiert, oder es selbst tun. Dieser startet zuerst das erste Fenster, und gibt diese implementierende Klasse (z.B. sich selbst) mit.

Das erste Fenster macht fröhlich seinen Krams, aber in dem Moment, wo der "Schließen"-Button gedrückt wird, muss ja der Controller Bescheid kriegen.

Das machst du, in dem du dem Schließenbutton einen Actionlistener hinzufügst:

closeButton.addActionListener(listener);

Wenn der Schließenbutton noch andere ActionListener hat, musst du diesen als letztes hinzufügen, der Reihenfolge wegen, in der die Befehle abgearbeitet werden.

Wenn eine Klasse von ActionListener implementiert, muss die Methode actionPerformed(ActionEvent event) überschrieben werden. In diese Methode kommt folgendes:

Du machst das alter Fenster unsichtbar. Du startest das Neue. Das Neue kann sich in seinem Konstruktor selbst einrichten. So weit, so klar?

Das war eigentlich schon der Ganze Zauber.

Mach in der JFrame klasse public static Klassenname instance = new Klassenname(); in der mehthode wo dus erstellst dann instance = this; und aus der anderer Klasse kannst du dann Klassenname(also von der anderen).instance.dispose();

Also wenn im ersten Frame der Button gedrückt wird erstellst du in dieser Methode eine neue Instanz vom zweiten Frame (achja kleine Anmerkung: Klassen sollten immer mit einem Großbuchstaben beginnen)

framePE frame2 = new framePE(); //Erstellt den neuen Frame
setVisible(false); //Macht den ersten Frame unsichtbar

Anschließend musst du den zweiten Frame entweder in dessen Konstruktor ODER in der Button-Eventmethode sichtbar machen

setVisible(true); // Im Konstruktor von FramePE
frame2.setVisible(true); // In der Eventmethode

Wenn nicht in einer der Klassen einen Programmierfehler hast sollte alles klappen

FSXPlayerEli 
Fragesteller
 10.02.2017, 17:46

Das Funktioniert nicht

0
MischtAnonymus  10.02.2017, 17:49
@FSXPlayerEli

Kopier mal deine beiden Klassen hier rein. Scheint so als wär das Problem an einer anderen Stelle.

0