# Aktuelles Fenster schliessen



## drei1padsvb (6. Dez 2011)

Hi zusammen,

ich habe in einer separaten Klasse ein JMenu erstellt mit den verschiedenen ActionListenern.
Beispiel:

```
goToAircrafType.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                aufruf_AircraftTypManage.showAircraftTypManage();
                frame.setVisible(false);
            }
        });
```

Aus den anderen Klassen greife ich über

```
MenueBar menueBar = new MenueBar();
frame.setJMenuBar(menueBar.getMenueLeiste());
```
auf die MenuBar zu.

Wenn ich nun im Menü auf den Menüeintrag klicke, öffnet sich auch das gewünschte Fenster "AircraftTypManage".
Allerdings ist das vorige Fenster noch geöffnet.

Wie krieg ich es hin, dass das aktuelle Fenster geschlossen wird?
Vielleicht ist eine relevante Information, dass ich von mehreren Fenster aus auf die MenuBar zugreife, um zu anderen Fenstern zu springen.

Ich hoffe meine Erklärung war einigermaßen verständlich.
Vielen Dank schonmal!


----------



## bERt0r (6. Dez 2011)

drei1padsvb hat gesagt.:


> Vielleicht ist eine relevante Information, dass ich von mehreren Fenster aus auf die MenuBar zugreife, um zu anderen Fenstern zu springen.



Huch? Das klingt ziemlich merkwürdig und nach schlechtem Design. Du solltest dich um eine saubere Trennung der einzelnen Komponenten kümmern.
Zu deinem Problem, es wäre nett zu wissen was showAircraftTypManage() macht. Hast du schonmal probiert, erst den frame zu schließen und dann dein neues Fenster anzuzeigen?


----------



## drei1padsvb (6. Dez 2011)

Erstmal Danke für deine Antwort!

Ich versuch es mal zu erklären:
Ich  habe ein Managementsystem, das Flüge verwaltet.
Es gibt verschiedene Masken:

Flug verwalten
Flugzeugtyp verwalten
Fluglinie verwalten
Fluggast verwalten
 usw.

In jedem Fenster ist oben das JMenu, durch das ich direkt zu den anderen Verwaltungsklassen springen kann.

showAircraftTypManage() öffnet ein neues Fenster, in dem ich den Flugzeugtyp verwalten kann.

Zuerst das Frame schliessen und dann das neue Fenster anzeigen zu lassen, hat leider nicht geklappt.


----------



## VfL_Freak (6. Dez 2011)

Moin,

und wie und wo ist Dein ActionListener angebunden ???:L
Geht es dabei um die Action "Menüpunkt aufrufen ???:L


Gruß
Klaus


----------



## drei1padsvb (6. Dez 2011)

Hi,

die ActionListener sind in der MenueBar-Klasse.
Genau, es geht dabei um die Action "Menüpunkt aufrufen.

Ich poste mal hier komplett die betreffende MenueBar-Klasse und eine weitere Klasse (in diesem Fall Booking.java), in der MenueBar eingebunden ist.

MenueBar.java:

```
package InterfaceTest;

import java.awt.event.*;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JSeparator;

public class MenueBar {

    Startpage aufruf_Startpage = new Startpage();
    static Editor aufruf_Editor = new Editor();
    FlugAnlegen aufruf_FlugAnlegen = new FlugAnlegen();
    Flight aufruf_Flight = new Flight();
    FlugEditieren aufruf_FlugEditieren = new FlugEditieren();
    FlugLoeschen aufruf_FlugLoeschen = new FlugLoeschen();
    Airport aufruf_Airport = new Airport();
    Booking aufruf_Booking = new Booking();
    FlightRealization aufruf_FlightRealization = new FlightRealization();
    SeatStructure aufruf_SeatStructure = new SeatStructure();
    AircraftTypManage aufruf_AircraftTypManage = new AircraftTypManage();
    AircraftManage aufruf_AircraftManage = new AircraftManage();
    AirlineManage aufruf_AirlineManage = new AirlineManage();
    PassengerManage aufruf_PassengerManage = new PassengerManage();

public JMenuBar getMenueLeiste() {
    return menueLeiste;
    }

    //Menüleiste
    JMenuBar menueLeiste;

    //Menüleiste Elemente
    JMenu datei = new JMenu("Datei");
    JMenu geheZu = new JMenu("Gehe Zu");



    //Datei
    JMenuItem beenden = new JMenuItem("Programm beenden");

    //titel
    JMenuItem goToEditor = new JMenuItem("Editor");
    JMenuItem goToMainPage = new JMenuItem("Startseite");
    JMenuItem goToAircrafType = new JMenuItem("Flugzeugtyp verwalten");
    JMenuItem goToAircraft = new JMenuItem("Flugzeug verwalten");
    JMenuItem goToAirline = new JMenuItem("Fluglinie verwalten");
    JMenuItem goToAirport = new JMenuItem("Flughafen verwalten");
    JMenuItem goToFlight = new JMenuItem("Flug verwalten");
    JMenuItem goToPassenger = new JMenuItem("Fluggast verwalten");
    JMenuItem goToBooking = new JMenuItem("Buchung verwalten");
    JMenuItem goToFlightRealization = new JMenuItem("Flugdurchführung verwalten");
    JMenuItem goToSeatStructure = new JMenuItem("Sitzplatzstruktur verwalten");


    public MenueBar(){

        menueLeiste = new JMenuBar();

        //Menüelemente erzeugen

        //Menüelemente hinzufügen
        menueLeiste.add(datei);
        menueLeiste.add(geheZu);


        datei.add(beenden);

        geheZu.add(goToMainPage);
        geheZu.add(goToEditor);
        geheZu.add(new JSeparator()); // SEPARATOR
        geheZu.add(goToAircrafType);
        geheZu.add(goToAircraft);
        geheZu.add(goToAirline);
        geheZu.add(goToAirport);
        geheZu.add(goToFlight);
        geheZu.add(goToPassenger);
        geheZu.add(goToBooking);
        geheZu.add(goToFlightRealization);
        geheZu.add(goToSeatStructure);

        
    final JFrame frame = new JFrame ();


    beenden.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

            System.exit(0);
            }
        });
    goToEditor.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

            frame.setVisible(false);
            aufruf_Editor.showEditor();
            
            }
        });
    goToMainPage.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

            aufruf_Startpage.createAndShowGUI();
            frame.setVisible(false);;
            }
        });
    goToAircrafType.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                aufruf_AircraftTypManage.showAircraftTypManage();
                frame.setVisible(false);
            }
        });
    goToAircraft.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_AircraftManage.showAircraftManage();
            }
        });
    goToAirline.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_AirlineManage.showAirlineManage();
            }
        });
    goToAirport.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_Airport.showAirport();
            }
        });
    goToFlight.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_Flight.showFlight();
            }
        });
    goToPassenger.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_PassengerManage.showPassengerManage();
            }
        });
    goToBooking.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_Booking.showBooking();
            }
        });
    goToFlightRealization.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_FlightRealization.showFlightRealization();
            }
        });
    goToSeatStructure.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_SeatStructure.showSeatStructure();
            }
        });

}
}
```

Booking.java:

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package InterfaceTest;

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

/**
 *
 * @author ccc
 */
public class Booking {
Startpage aufruf_Startpage = new Startpage();
static Editor aufruf_Editor = new Editor();
BuchungAnlegen aufruf_BuchungAnlegen = new BuchungAnlegen();
BuchungEditieren aufruf_BuchungEditieren = new BuchungEditieren();
BuchungLoeschen aufruf_BuchungLoeschen = new BuchungLoeschen();
CheckIn aufruf_CheckIn = new CheckIn();


    public void showBooking(){

    // Erstellung und Einstellungen vom Bookingfenster
    //**********************************************************************
    final JFrame frame = new JFrame ("Buchung verwalten");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    MenueBar menueBar = new MenueBar();
    frame.setJMenuBar(menueBar.getMenueLeiste());
 
    // Panel Erstellung
    //**********************************************************************
    JPanel mainPanel = new JPanel();

         //Panels
    //**********************************************************************
    //Main
    mainPanel.setBackground(Color.GRAY);
    mainPanel.setSize(640, 480);


    //GridBagLayout
    //**********************************************************************
    GridBagLayout gbl = new GridBagLayout();
    mainPanel.setLayout(gbl);

    GridBagConstraints constraints = new GridBagConstraints();

    constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
    constraints.weightx = 1;                     // Breite
    constraints.weighty = 1;                    // Höhe
    constraints.insets = new Insets(0,0,1,1);   // Abstände definieren

    //Label
    //**********************************************************************

    JLabel label1 = new JLabel("Editor > Buchung verwalten");
    constraints.gridx = 0;
    constraints.gridy = 0;
    label1.setForeground(Color.WHITE);
    mainPanel.add(label1, constraints);

    //Buttons
    //**********************************************************************


    JButton button_Buchung_A = new JButton("Buchung anlegen");
    constraints.gridx = 0;
    constraints.gridy = 1;
    mainPanel.add(button_Buchung_A, constraints);

    JButton button_Buchung_E = new JButton("Buchung editieren/löschen");
    constraints.gridx = 1;
    constraints.gridy = 1;
    mainPanel.add(button_Buchung_E, constraints);

    JButton button_CheckIn_V = new JButton("Check-In verwalten");
    constraints.gridx = 0;
    constraints.gridy = 2;
    mainPanel.add(button_CheckIn_V, constraints);

    JButton Zurueck = new JButton("Zurück");
    constraints.gridx = 0;
    constraints.gridy = 3;
    mainPanel.add(Zurueck, constraints);

    JButton Beenden = new JButton("Beenden");
    constraints.gridx = 1;
    constraints.gridy = 3;
    mainPanel.add(Beenden, constraints);



    //Panels
    //**********************************************************************
    //Main
    mainPanel.setBackground(Color.GRAY);
    mainPanel.setSize(640, 480);




   //Action Listener
   //**********************************************************************
   Beenden.addActionListener(new ActionListener() {

    public void actionPerformed(ActionEvent e) {
        System.exit(0);
    }
    });
    Zurueck.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_Editor.showEditor();
            }
        });
    button_Buchung_A.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_BuchungAnlegen.showBuchungAnlegen();
            }
        });
    button_Buchung_E.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_BuchungEditieren.showBuchungEditieren();
            }
        });
    button_CheckIn_V.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e){

                frame.setVisible(false);
                aufruf_CheckIn.showCheckIn();
            }
        });


    //zeigt das Frame an
    //**********************************************************************
    frame.pack();
    frame.setVisible(true);
    frame.getContentPane().add(mainPanel);
    // frame.add(mainPanel);
    frame.setSize(640, 480);
    frame.setLocationRelativeTo(null);


    }

}
```


----------



## turtle (6. Dez 2011)

> In jedem Fenster ist oben das JMenu, durch das ich direkt zu den anderen Verwaltungsklassen springen kann



Verstehe ich das richtig, das in der Applikation 4-5 Fenster offen sein können, jedes mit einer (gleichen) MenuBar? Vielleicht hilft ein Screenshot?

Wenn dem so ist, würde ich mir überlegen, ob es sinnvoll ist, das der Benutzer dies tun kann. Zum Beispiel könnte man dies durch einen modalen Dialog verhindern. 

Wenn es nicht möglich sein soll, aber trotzdem eine MenuBar angezeigt werden soll, musst Du diese wohl disablen während ein Fenster offen ist und das Menu erst wieder enablen, wenn das Fenster geschlossen wird.

Hört sich für mich merkwürdig an. Bei "normalen" GUIs erwarte ich aber, dass ich mehrere Fenster aufhaben kann, oder?


----------



## bERt0r (6. Dez 2011)

Wenn alle deine Masken die gleiche Menubar haben sollen, warum steckst du die Masken in verschiedene Fenster? Lass den Frame gleich und tausch das ContentPane aus bzw. nutze ein CardLayout.


----------



## drei1padsvb (6. Dez 2011)

Für dieses Projekt ist es nicht nötig und nicht möglich, dass mehrere Fenster gleichzeitig offen sind.
Es ist immer nur ein Fenster offen.

Ich habe hier mal zwei Screenshots, um das ganze etwas besser zu erklären.

Ich kann die Flugbuchungen verwalten (Anlegen / Editieren / Löschen).






Geh ich nun in Buchung anlegen, schliesst sich Verwalten Fenster und Buchung anlegen öffnet sich.





Und bei jedem aktuell offenem Fenster, habe ich die Möglichkeit, über die MenueBar direkt in ein anderes Menü zu springen:


----------



## Michael... (6. Dez 2011)

Gerade für so etwas zwängt sich einem das CardLayout ja quasi auf.
Oder hast Du bei anderen Buchungs/Verwaltungs Systemen schon mal gesehen, dass sich Fenster öffnen und schließen? Eine Java Anwendung mit mehr als einen Fenster ist m.M. schon mal grundsätzlich fragwürdig.

##### EDIT #####
Hier eine Demo zum CardLayout
http://www.java-forum.org/awt-swing-swt/86568-aufrufen-eigener-klasse.html#post543832


----------



## drei1padsvb (6. Dez 2011)

Ja, da hast du allerdings recht.

Aber leider ist das eine Vorgabe der Professoren für dieses Projekt, an das wir uns halten müssen.

Deswegen hoffe ich, dass es irgendwie möglich ist, dass bei Auswahl/Aktion über die MenueBar das aktuelle Fenster geschlossen wird, bevor das neue geöffnet wird.


----------



## Michael... (6. Dez 2011)

drei1padsvb hat gesagt.:


> Aber leider ist das eine Vorgabe der Professoren für dieses Projekt, an das wir uns halten müssen.


Sowas ist Vorgabe? Ist das dann Irrsinn oder Schickane? ;-)

Wenn ich sowas so umsetzen müsste, würde ich einfach eine "Controller" Klasse schreiben, die alle notwendigen Frames erzeugt und die Referenzen darauf hält.
Wird aus einem Frame eine Aktion ausgelöst die einen anderen Frame sichtbar machen soll. Teilt der Frame der Controller Klasse mit welcher Frame angezeigt werden soll. Dieser kümmert sich dann darum, dass nur der alte Frame unsichtbar und der nächst sichtbar gemacht wird.

Wobei das bzgl. Programmierung und Architektur totaler Schmarrn ist und mir nicht klar ist was Studenten daraus lernen sollen - außer, wie man es nicht macht...


----------



## drei1padsvb (6. Dez 2011)

Ok,
vielen Dank für deine Hilfe.
Ich werde mal versuchen so eine "Controller"-Klasse zu schreiben.


----------



## drei1padsvb (7. Dez 2011)

Ich habe das Problem nun so Lösen können.

Bsp. eines ActionListeners in MenueBar.java:

```
goToEditor.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                JMenuItem menuItem = (JMenuItem) e.getSource();
                JPopupMenu popupMenu = (JPopupMenu) menuItem.getParent();
                Component invoker = popupMenu.getInvoker(); //this is the JMenu (in my code)
                JComponent invokerAsJComponent = (JComponent) invoker;
                Container topLevel = invokerAsJComponent.getTopLevelAncestor();
                topLevel.setVisible(false);
                aufruf_Editor.showEditor();
            }
        });
```

Trotzdem vielen Dank für Eure Antworten!


----------

