Swing Wechsel zwischen Frames

HankScorpio

Mitglied
Hallo,

ich muss gerade im Moment ein Programm basteln, dessen Oberfläche ungefähr so funktionieren muss, wie meine Skizze im Anhang verdeutlichen soll. Das Bildchen ist natürlich stark vereinfacht und soll nur zeigen, worauf ich hinausmöchte.

Nach dem Start öffnet ein großer JFrame (standardmäßig maximiert), sozusagen das Hauptmenü. Darin kann man Vorgänge wählen. Wird ein Vorgang gestartet, soll das Hauptmenü verschwinden und ein neues Fenster öffnet sich. In dem Fenster können dann verschiedene Dinge gemacht werden und ggf. weitere JDialogs modal dazu angezeigt werden.
So weit. So gut.
Jetzt ist aber die Anforderung, dass man nach Beendigung und Schließen dieses Vorgangsfensters wieder zum Hauptmenü - zum Hauptframe - zurückgelangen soll. Von dort aus soll dann der nächste Vorgang aufgerufen werden können (oder man beendet das Programm von dort aus).

Wie könnte ich das am geschicktesten anstellen? Hat jemand einen Rat für mich?

Ich kann kein MDI benutzen oder ein großes Fenster, wo links Explorer-like die Vorgänge sind und rechts der jeweilige Vorgang oder sowas. Es soll von der Funktionsweise schon so sein, wie beschrieben. Ich kann auch nicht einfach den Inhalt des ContentPane des Hauptmenüs austauschen durch den Vorgangskram, weil ich sozusagen annehmen muss, dass ich nicht weiß, was da für Unterprogramme aufgerufen werden.

Ein paar Probleme, die ich dabei habe:
  • Den schönen modalen JDialog kann ich eigentlich nicht nehmen, weil der nicht maximiert werden kann (soll?).
    Sonst ginge das ja sicher ganz gut: Hauptmenü ausblenden -> Modal dazu das neue Fenster starten -> Hauptmenü pausiert solange, wie modales Fenster aktiv -> Bei Rückkehr des Kontrollflusses zum Hauptmenü einfach dieses wieder sichtbar schalten
  • Wenn ich vom Hauptmenü-Frame aus den Vorgangs-Frame erzeuge und vom Vorgangs-Frame aus wieder einen Hauptmenü-Frame usw., läuft sicher irgendwann der Stack über, oder?
  • Wenn ich eine große Ereignisschleife (*schauder* *uäääh*) baue (Hauptmenü anzeigen > Abwarten, bis geschlossen > Auswahl abfragen > Vorgang starten > Abwarten, bis geschlossen > Zurück zum Anfang), müsste ich in der Ereignisschleife irgendwie auf die Beendigung der Frames warten... :-? Kann ja schlecht
    Code:
    while (!frameXY.isFinished()) { }
    machen. Ich weiß, dass der Gedanke, das so zu machen, gruselig und verkehrt ist. 😉

Stehe gerade etwas auf dem Schlauch... Kann mir jemand weiterhelfen?
Danke für eure Hilfe!

Euer
Hank Scorpio 😉
 
Grundsätzlich stellt sich für mich die Frage, warum man das über zwei Frames abbilden will. Könnte nicht einfach der Inhalt des ersten Frames von der Menüanzeige zu Vergangsanzeige wechseln, siehe CardLayout.
Falls man auf die zwei Frames nicht verzichten will: Einfach einen WindowListener an den zweiten Frame, wenn dieser geschlossen wird macht er den ersten Frame wieder sichtbar, oder einen Button mit ActionListener darauf der den zweiten Frame unsichtbar macht oder schließt und den ersten sichtbar macht.
 
Danke für die schnelle Hilfe!

Einfach einen WindowListener an den zweiten Frame, wenn dieser geschlossen wird macht er den ersten Frame wieder sichtbar, oder einen Button mit ActionListener darauf der den zweiten Frame unsichtbar macht oder schließt und den ersten sichtbar macht.

Eine Rückfrage noch: Dazu müssten dann alle JFrames, die "Vorgangsframe" extenden, z.B. im Konstruktor eine Referenz auf den Hauptmenü-JFrame erhalten, oder? Dann könnten die darüber in einem Action-/WindowListener diesen Frame wieder auf Visible<-true setzen und daraufhin sich selber auf Visible<-false oder versteh ich das falsch?

Wenn ich das so mache und Folgendes passiert ist:
  • Im Hauptmenü wird ein Vorgang aufgerufen. Daraus folgt:
    Java:
    private void zeigVorgangsfenster () {
      setVisible(false);  // Hauptmenü ausblenden
      BlaFrame vorgangsFenster = new BlaFrame(this);  // this == der Hauptmenü-JFrame
      vorgangsFenster.setVisible(true); // Jetzt müsste man im vorgangsFenster arbeiten können.
    }
  • Nach getaner Arbeit im "Unter-Frame":
    Java:
    private void zurueckZumHauptmenue () {
      setVisible(false);  //Vorgangs-Frame ausblenden
      refHauptmenue.setVisible(true);
    }
  • Benutzer ist wieder im Hauptmenü.
Wird jetzt der unsichtbare vorgangsFenster-Frame vom Garbage Collector getilgt, sobald die Hauptmenü-Methode "zeigVorgangsfenster" verlassen wird, in der dieses Frame-Objekt erzeugt wurde (mit new)? Die Referenz auf den Unterframe wäre ja eigentlich nur im Scope der Methode gültig. Der wird verlassen, also wäre der vorgangsFenster-Frame aus dem Speicher weg, sobald man wieder im Hauptmenü ist, oder? Oder bleibt der unsichtbar irgendwie hängen, solange das von ihm wieder sichtbar geschaltete Hauptmenü läuft?

Uff, kompliziert. Ich hoffe, das ist einigermaßen zu verstehen, was ich noch nicht ganz verstehe... 😀
 
Eine Rückfrage noch: Dazu müssten dann alle JFrames, die "Vorgangsframe" extenden, z.B. im Konstruktor eine Referenz auf den Hauptmenü-JFrame erhalten, oder?
Nein, nicht unbedingt bzw. nicht unbedingt so direkt. Man könnte auch in oder über den Hauptframe einen Listener definieren und diesen an die neu erzeugten Vorgangsframes übergeben.

Wobei ich persönlich das in einem Frame und mittels CardLayout implementieren würde.
Wird jetzt der unsichtbare vorgangsFenster-Frame vom Garbage Collector getilgt, sobald die Hauptmenü-Methode "zeigVorgangsfenster" verlassen wird, in der dieses Frame-Objekt erzeugt wurde (mit new)? Die Referenz auf den Unterframe wäre ja eigentlich nur im Scope der Methode gültig. Der wird verlassen, also wäre der vorgangsFenster-Frame aus dem Speicher weg, sobald man wieder im Hauptmenü ist, oder? Oder bleibt der unsichtbar irgendwie hängen, solange das von ihm wieder sichtbar geschaltete Hauptmenü läuft?
Um ein Fenster "komplett" zu schließen und alle Resourcen freizugeben gibt es die Methode dispose()
 
Nein, nicht unbedingt bzw. nicht unbedingt so direkt. Man könnte auch in oder über den Hauptframe einen Listener definieren und diesen an die neu erzeugten Vorgangsframes übergeben.
Ich hab jetzt mal ein bisschen experimentiert, aber das versteh ich noch nicht ganz. :/ Welche Vorteile hätte das gegenüber dem Weiterreichen einer Referenz auf den ganzen Hauptmenü-Frame? Oder wie müsste der Listener aussehen, den man an die neuen Vorgangs-Frames übergibt?

Also ich könnte mir vorstellen, im Vorgangsframe einen WindowListener auf diesen neuen Frame einzubauen, der bei windowClosed automatisch den Haupt-Frame wieder sichtbar macht, aber dafür bräuchte ich ja auch eine Referenz auf den Hauptmenü-JFrame. Sonst komme ich ja nicht an die Methode setVisible?

Danke auf jeden Fall schon mal für die Tipps bisher!!
 
Naja, du kannst ja vom Hauptframe aus auf den "Kindframe" Kindframe.addWindowListener() machen.
Edit: Und ich schließe mich Michael an, ich würde das auch mit einem CardLayout machen.
 
Zuletzt bearbeitet:
auch ich schließe mich den Vorredner an...eine Anwendung, ein Frame!

aber und am Anfang scheint(ist) es wahrscheinlich einfacher (zu sein)...
Ich habe meine ersten Applicationen auch mit vielen Frames realisiert. Dafür hatte ich mir eine FrameManagerKlasse geschrieben, die dann die "Logik", wann welcher Frame geöffnet wird, welcher geschlossen wird und was sonst so passieren soll, implementierte. Diese Klasse bekam alle "Frames" übergeben und bot statische Methoden zum disposen, toFront, und was weiß ich noch....
In den entsprechenden Listener (closeFrame) musste dann der FrameManager über statischen Methoden informiert werden und entsprechend reagieren.

Irgendwann wirst du sehen, dass ein Frame für eine Anwendung ausreicht...aber bis dahin ist es zumindest eine Möglichkeit mehr.
 

Zurück
Oben