# Neuen JFrame öffnen und alten schließen



## Oli_FFM (19. Jan 2015)

Hi Leute,

ich brauche dringend Hilfe, ich bin am Verzweifeln!

Ich bin dabei ein Programm zu schreiben. Ist ein Kochbuch mit Hauptmenü. Ich habe mir also eine GUI für das Menü erstellt und dort Buttons eingebaut. Die Buttons sollen eine anderes Fenster (also einen neuen Frame) öffnen. Und das tun sie auch, kein Thema. Nur dann kommt mein Problem:

Ich möchte also den neuen Frame öffnen (kein Problem), Dann habe ich im neuen Frame wieder einen Button und sobald ich diesen drücke soll das zweite Frame sich schließen und das 3 Frame öffnen, so dass nur der neue offen und mein Hauptfenster offen ist.

Bitte um Hilfe ???:L


----------



## Khal Drogo (19. Jan 2015)

Bekommen wir auch ein bisschen Code deinerseits?

Mit freundlichen Grüßen
Xelsarion


----------



## Java20134 (19. Jan 2015)

Naja das ist eigentlich auch nicht so schwer. Dein JFrame kannst du mit zwei Methoden schließen.

```
JFrame frame; 
frame.dispose(); //1.Methode: Das JFrame arbeitet noch ganz kurz und schließt sich selbst
frame.setVisible(false); //2.Methode: Das JFrame ist einfach nicht mehr sichtbar
```
Bei der ersten Methode bin ich mir nicht ganz sicher, ob man in der Methode setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); angeben muss. Das müsstest du dann einmal ausprobieren.


----------



## Oli_FFM (19. Jan 2015)

```
public class Rezepte extends JFrame implements ActionListener{

	/*
	 * Instanzvariablen
	 */
		  private JPanel jpnlCenter = new JPanel();
		  private JPanel jpnlSouth = new JPanel();
		  private Container cp;
		  private JLabel jlblTitel;
		  private JLabel jlblWilkommen;
		  private JButton jbtFleisch = new JButton ("Fleisch");
		  private JButton jbtVegetarisch = new JButton ("Vegetarisch");
		  private JButton jbtHome = new JButton ("Home");
		  
	/**
	* Erzeugt ein Fenster mit dem spezifizierten Titel.
	* 
	*  
	* 
	* @param title Titel des Fensters
	* 
	*/
		  
		  
		  
		  
		  public Rezepte (String title) {
		    super(title);
		    setSize(450, 290);
		    

		    cp = getContentPane();
		    cp.add(BorderLayout.CENTER, jpnlCenter); 
		    // Standart ist das BorderLayout
		    jpnlCenter.setLayout(null);

		    // Panel im unteren Bereich
		    cp.add(BorderLayout.SOUTH, jpnlSouth);

		    // Panel im oberen Bereich
		    //cp.add(jPanelNorth, BorderLayout.NORTH);

		    erstellenWidgets();
		    setzenLayoutManager();
		    hinzufuegenWidgets();
		    actionlistener();

		    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		    setLocationRelativeTo(null);

		  }

		  private void erstellenWidgets() {

		    jlblTitel = new JLabel("Rezepte");
		    jlblTitel.setFont(new Font("Arial", Font.BOLD + Font.ITALIC, 30));
		    jlblTitel.setForeground(Color.BLACK);
		    jlblTitel.setOpaque(true);
		    jlblTitel.setBackground(Color.CYAN);
		    jlblTitel.setHorizontalAlignment(SwingConstants.CENTER);


		    jlblWilkommen = new JLabel("Treffen Sie bitte ihre Auswahl!");
		    jlblWilkommen.setHorizontalAlignment(SwingConstants.CENTER);
		    jlblWilkommen.setFont(new Font("Arial", Font.BOLD, 14));
		    jlblWilkommen.setPreferredSize(new Dimension(0, 150));
		    jlblWilkommen.setForeground(Color.BLACK);
		    jlblWilkommen.setOpaque(true);
		    jlblWilkommen.setBackground(Color.WHITE);
		    jlblWilkommen.setAlignmentX(LEFT_ALIGNMENT);
		    
		    
		    // Buttongröße ändern
		    jbtFleisch.setPreferredSize(new Dimension(140,50));
		    jbtFleisch.setFont(new Font("Arial", Font.BOLD, 14));
		    jbtVegetarisch.setPreferredSize(new Dimension(140,50));
		    jbtVegetarisch.setFont(new Font("Arial", Font.BOLD, 14));
		    jbtHome.setPreferredSize(new Dimension(75,50));
		    jbtHome.setFont(new Font("Arial", Font.BOLD, 14));
		    
		    
		    jpnlSouth.add(jbtFleisch);
		    jpnlSouth.add(jbtVegetarisch);
		    jpnlSouth.add(jbtHome);

		    		    
		  }
		  
		  private void actionlistener() {
				 

				    jbtFleisch.addActionListener(this);
				    jbtVegetarisch.addActionListener(this);
				    jbtHome.addActionListener(this);
				    

				    }
				    public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
						Object obj = e.getSource();

						// Home Befehl wenn Home Button betätigt wird
						if (obj == jbtHome) {
							dispose();
								}
						
						}

		  private void setzenLayoutManager() {
		    cp.setLayout(new BorderLayout());

		  }

		  private void hinzufuegenWidgets() {
		    cp.add(BorderLayout.NORTH, jlblTitel);
		    cp.add(BorderLayout.SOUTH, jpnlSouth);
		    cp.add(BorderLayout.CENTER, jlblWilkommen);
		  }
		}
```

Hier ist die zweite Klasse.
Wollte das so machen das ich entweder beim öffnen eines weiteren Fensters das vorherige geschlossen wird oder das ich Über meinen Home Button auf das Hauptfenster zurück komme.

@Java20134 Ich bin leider anfänger daher fallen mir auch solche sachen leider schwer oder besser gesagt sind Kompliziert


----------



## Oli_FFM (19. Jan 2015)

@Java20134 
Ich habe das jetzt mit deiner 2 Methode ausprobiert nur leider bekomme ich da einen Fehler :-/

	JFrame Rezeptbuch;
			Rezeptbuch.setVisible(false);

Was habe ich da falsch gemacht?


----------



## Java20134 (19. Jan 2015)

Naja wie sieht denn dann die Klasse Rezeptbuch aus?


----------



## Oli_FFM (20. Jan 2015)

```
public class Rezeptbuch extends JFrame implements ActionListener{

	/*
	 * Instanzvariablen
	 */
		  private JPanel jpnlCenter = new JPanel();
		  private JPanel jpnlSouth = new JPanel();
		  private Container cp;
		  private JLabel jlblTitel;
		  private JLabel jlblWilkommen;
		  private JButton jbtRezepte = new JButton ("Rezepte");
		  private JButton jbtVorschläge = new JButton ("Vorschläge");
		  private JButton jbtHome = new JButton ("Home");
		  
	/**
	* Erzeugt ein Fenster mit dem spezifizierten Titel.
	* 
	*  
	* 
	* @param title Titel des Fensters
	* 
	*/
		  
		  
		  
		  
		  public Rezeptbuch (String title) {
		    super(title);
		    setSize(450, 290);
		    

		    cp = getContentPane();
		    cp.add(BorderLayout.CENTER, jpnlCenter); 
		    // Standart ist das BorderLayout
		    jpnlCenter.setLayout(null);

		    // Panel im unteren Bereich
		    cp.add(BorderLayout.SOUTH, jpnlSouth);

		    // Panel im oberen Bereich
		    //cp.add(jPanelNorth, BorderLayout.NORTH);

		    erstellenWidgets();
		    setzenLayoutManager();
		    hinzufuegenWidgets();
		    actionlistener();

		    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		    setLocationRelativeTo(null);

		  }

		  private void erstellenWidgets() {

		    jlblTitel = new JLabel("Rezeptbuch");
		    jlblTitel.setFont(new Font("Arial", Font.BOLD + Font.ITALIC, 30));
		    jlblTitel.setForeground(Color.BLACK);
		    jlblTitel.setOpaque(true);
		    jlblTitel.setBackground(Color.MAGENTA);
		    jlblTitel.setHorizontalAlignment(SwingConstants.CENTER);


		    jlblWilkommen = new JLabel("Treffen Sie bitte ihre Auswahl!");
		    jlblWilkommen.setHorizontalAlignment(SwingConstants.CENTER);
		    jlblWilkommen.setFont(new Font("Arial", Font.BOLD, 14));
		    jlblWilkommen.setPreferredSize(new Dimension(0, 150));
		    jlblWilkommen.setForeground(Color.BLACK);
		    jlblWilkommen.setOpaque(true);
		    jlblWilkommen.setBackground(Color.WHITE);
		    jlblWilkommen.setAlignmentX(LEFT_ALIGNMENT);
		    
		    
		    // Buttongröße ändern
		    jbtRezepte.setPreferredSize(new Dimension(140,50));
		    jbtRezepte.setFont(new Font("Arial", Font.BOLD, 14));
		    jbtVorschläge.setPreferredSize(new Dimension(140,50));
		    jbtVorschläge.setFont(new Font("Arial", Font.BOLD, 14));
		    jbtHome.setPreferredSize(new Dimension(75,50));
		    jbtHome.setFont(new Font("Arial", Font.BOLD, 14));
		    
		    
		    jpnlSouth.add(jbtRezepte);
		    jpnlSouth.add(jbtVorschläge);
		    jpnlSouth.add(jbtHome);

		    		    
		  }
		  
		  private void actionlistener() {
				 // Action fuer den Rezeptbuch Button

				    jbtRezepte.addActionListener(this);
				    jbtVorschläge.addActionListener(this);
				    jbtHome.addActionListener(this);

				    }
				    public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
						Object obj = e.getSource();
						
						// Rezeptbuch Befehl wenn Rezeptbuch Button betätigt wird
						if (obj == jbtRezepte) {
							JFrame Rezepte = new Rezepte ("Hightech-Kühlschrank") ;
							Rezepte.setVisible(true);
						}

						// Home Befehl wenn Home Button betätigt wird
						if (obj == jbtHome) {
							this.dispose();
								}
						
					
						
						}

		  private void setzenLayoutManager() {
		    cp.setLayout(new BorderLayout());

		  }

		  private void hinzufuegenWidgets() {
		    cp.add(BorderLayout.NORTH, jlblTitel);
		    cp.add(BorderLayout.SOUTH, jpnlSouth);
		    cp.add(BorderLayout.CENTER, jlblWilkommen);
		  }
		}
```

Die Klassen sind weit gehend Identisch. Nur bekomme ich wie gesagt das Problem nicht gelöst das aktuelle fenster zu Schließen sobald ich über einen Button das neue Öffne. :bahnhof:


----------



## Java20134 (20. Jan 2015)

Die Klasse Rezeptbuch ist die Main Klasse, soweit ich das mitbekommen habe. Dort kannst du immer wieder ein neues Rezept erstellen. dabei nimmst du ja bis hierhin immer dieselbe Klasse. Deshalb würde ich das erst einmal ganz einfach machen, indem du in deinem Konstruktor schon einmal ein Rezept erstellst ohne das Visible zu setzen. In der Methode des ActionListeners sagst du dann nur noch das das vorherige geschlossen werden soll und ein neues erstellt werden soll und visible sein soll.

```
//im Konstruktor
Rezepte rezept = new Rezepte("");

//in der Methode des ActionListener
rezept.dipose();
Rezepte rezept = new Rezepte("");
rezepte.setVisible(true);
```
Wenn du nun noch die Rezepte weiter kategorisierst, würde ich die weiteren Rezepte immer wieder von Rezepte erben lassen. Dadurch kannst du das oben genannte auch beibehalten und musst dir nicht noch irgendetwas ausdenken. 

Beispiel: 

```
class Roulade extends Rezept {
  weiterer Inhalt; 
}
```

In der Methode des ActionListener schreibst du dann bei dem Button: 

```
rezept.dispose(); 
Rezepte rezept = new Roulade("");
rezept.setVisible(true);
```


----------

