Jframe schließen wenn neues Jframe geöffnet wird

Hallo,

Ich arbeite gerade an einem Spiel.
Mein Problem: wenn ich mein erstes JFrame öffne( Menue ) und dort dann das Spiel starten will klappt das alles jedoch will ich das dann das Jframe was das Menue zeigt verschwindet(setvisable(false)) da ich noch damit arbeiten will jedoch schaffe ich es nicht es umzusetzen. Mein code

package monopoly;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Menue extends JFrame implements ActionListener  {

    private JButton schließen;
    private JButton einstellungen;
    private JButton credits;
    private JButton ende;
    private JButton regeln;
    Image Startbild;

    public static void main(String[] args) {

        Menue bild = new Menue("Monopoly");
        bild.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        bild.setSize(1280,980);
        bild.setResizable(false);
        bild.setLocationRelativeTo(null);
        bild.setLayout(null);
        bild.setVisible(true);
        bild.getContentPane().setBackground(Color.black);
    }

    public Menue(String title) {

        super(title);
        Font myFont = new Font("Arial", Font.BOLD, 30);

        schließen = new JButton("Spiel starten");
        schließen.setBounds(512, 340, 256, 136);
        schließen.addActionListener(this);
        schließen.setFont(myFont);
        add(schließen);

        einstellungen = new JButton("Einstellungen");
        einstellungen.setBounds(256,540,256,136);
        einstellungen.addActionListener(this);
        einstellungen.setFont(myFont);
        add(einstellungen);

        regeln = new JButton("Regeln");
        regeln.setBounds(768,540,256,136);
        regeln.addActionListener(this);
        regeln.setFont(myFont);
        add(regeln);

        ende = new JButton("Ende");
        ende.setBounds(256,740,256,136);
        ende.addActionListener(this);
        ende.setFont(myFont);
        add(ende);

        credits = new JButton("Credits");
        credits.setBounds(768,740,256,136);
        credits.addActionListener(this);
        credits.setFont(myFont);
        add(credits);

        ImageIcon u = new ImageIcon(getClass().getResource("Startbild.png"));
        Startbild = u.getImage();
    }

    public void paint (Graphics g){

        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;

        g2d.drawImage(Startbild,320,0,null);
    }

    public void actionPerformed(ActionEvent e){

        if (e.getSource() == schließen){
            fenster(); 
        }

        if (e.getSource() == credits){
            Object[] options = { "Ok"};
            JOptionPane.showOptionDialog(null, "Programmiert von Philipp und Julian", "Information",
                JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE,
                null, options, options[0]);
        }

        if (e.getSource() == einstellungen){
            Object[] options = { "OK"};
            JOptionPane.showOptionDialog(null, "Hier können sie Einstellungen vornehmen", "Information",
                JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE,
                null, options, options[0]);
        }
        if(e.getSource()== regeln)
        {
            JOptionPane.showMessageDialog(null, "Hier stehen mal die Regeln wenn einer bock hat sie hin zu schreiben bei Julian melden gibt auch kekse");
        }

        if (e.getSource() == ende){
            System.exit(0);
        }
    }

    public static void fenster() {

        JFrame fenster = new JFrame("Game");
        fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        fenster.setSize(1000,1000);
        fenster.setVisible(true);
        //fenster.getContentPane().setBackground(Color.black);
        //fenster.setLayout(null);
        fenster.add(new gui());
    }

}

Vielen dank für die Hilfe im voraus:).

ja wie nun, im ganzen Code kein setVisible(false); wie selber genannt, warum nicht? keine Erklärung,
in der statischen Methode fenster() geht es schlecht, außer das JFrame wird als Parameter übergeben,
im ActionListener kann man aber einfach setVisible(false); schreiben und es passiert auch etwas,

so schon genug? Frage etwas unkar,


etwas Formatierung vor Posten im Forum macht besseren Eindruck,
eine IDE kann es mit einer Tastenkombination, sonst zumindest auf 10 Leerzeilen hintereinander
oder öffnende/ schließende Klammern aller Methoden achten

in fenster() das add(new gui()) auf dem neuen JFrame besser VOR dessen setVisible(true)

in einem JFrame besser nicht paint überschreiben, sondern nach Anleitung in einem JPanel, mit paintComponent() malen,
aber gut, mit Einfügen von Komponenten mag es eh komplizierter werden, Suche nach BackgroundImage

das Hinzufügen der Komponenten im Konstruktor + Setzen des Null-Layouts später in der main-Methode ist etwas konfus, gehört zusammen

Button ‘schließen’ passt zum Thementitel hier und einer Funktion, aber auch komischer Name für einen Button mit Text ‘Spiel starten’,
und standardmäßig vielleicht lieber ß, Umlaute und alles sonstiges verrücktes für alle Zeiten für Variablennamen usw. vermeiden, maximal in Strings für Anzeige

Erstmal danke für die tips konnte manche umsetzten und manches habe ich nicht verstanden ^^.
ich versuche meine Frage jetzt konkrekter zu stellen

public static void main(String[] args) {
		
		Menue bild = new Menue("Monopoly");
		bild.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		bild.setSize(1280,980);
		bild.setResizable(false);
		bild.setLocationRelativeTo(null);
		bild.setLayout(null);
		bild.setVisible(true);
		bild.getContentPane().setBackground(Color.black);
		
}

Hier setzte ich das Jframe ja auf sichtbar und wie bekomme ich es jetzt hin das ich hier :

public void actionPerformed(ActionEvent e){
		
		if (e.getSource() == schliessen){
			fenster();	// hier wird ja die fenster Methode gestartet und dann soll das obrige jFrame nicht mehr sichtbar sein
                        bild.setvisable(false);//so aber das klappt net weil ja bild. hier nicht mehr erkannt wird aber wie mache ich es dann?

                     }
}
			
			
			
		

Schon durch

        if (e.getSource() == schließen){
            setVisible(false);                 // <---- das hier
            fenster(); 
        }

wäre vermutlich das erreicht, was erreicht werden soll.

Ansonsten … ist das natürlich alles kagge :smiley:

In welcher Klasse seid ihr, und was ist das Ziel des ganzen?

Wie auch immer, erstmal kurz und teilweise wiederholend von SlaterB:

[ul]
[li]Variablennamen sinnvoller machen! Keine Umlaute in Variablennamen! (Am besten Englische Namen, auch für Klassen - es ist einfach besser)[/li][li]Man sollte üblicherweise nicht von JFrame erben. Die „Haupt-GUI-Klasse“ sollte bestenfalls von JPanel erben[/li][li]Nicht willkürlich „paint“ überschreiben. Und schon gar nicht von einem JFrame! Das Bild kann in der Haupt-GUI-Klasse gemalt werden, indem man „paintComponent“ von JPanel überschreibt[/li][li]Kein null-Layout verwenden, keine händischen „setBounds“-Aufrufe machen! Stattdessen einen LayoutManager verwenden: https://docs.oracle.com/javase/tutorial/uiswing/layout/using.html[/li][li]Top-Level-Components sollten üblicherweise nicht willkürliche Listener implementieren. Diese Abfrage in der „actionPerformed“ ist kagge. Gerade bei Buttons gibt es ja eine sehr einfache Lösung, besonders seit Java 8:[/li]```
void createGui()
{

JButton startGameButton = new JButton(„Start game“);
startGameButton.addActionListener(e → startGame()); // „Beim Klick diese Methode ausführen“

...

}
private void startGame() { … }

Und mit Java7 würde kleine, anonyme Listener verwenden. 
Das hat auch den Vorteil, dass man die ganzen Buttons nicht mehr oben in der Klasse als Fields auflisten muss, sondern einfach da deklariert, wo man sie braucht.
[/ul]

Danke erstmal für die Hinweiße konnte manche davon umsetzten.
Ich versuch jetzt mal meine Frgae im code zu stellen

public static void main(String[] args) {
		
		Menue bild = new Menue("Monopoly");
		bild.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		bild.setSize(1280,980);
		bild.setResizable(false);
		bild.setLocationRelativeTo(null);
		bild.setLayout(null);
		bild.setVisible(true);
		bild.getContentPane().setBackground(Color.black);
		
}

Hier erstelle ich ja mein erstes JFrame ( Menü )

public void actionPerformed(ActionEvent e){
		
		if (e.getSource() == schliessen){
			fenster();	// Hier wird dann das Spiel gestartet also der 2 JFrame und jetzt soll der 1. Jframe unsichtbar sein
                        bild.setvisible(false)// das geht aber nicht mir auch klar warum aber wie mache ich es dann?
			
			
			
		}

Beiträge waren freizuschalten (Spam-Schutz im Forum…), teils doppelt gepostet, war das Thema nun schon gelöst?

vorerst wieder Status Gelöst auf Offen gesetzt, wobei ja genug gesagt,
wenn noch Frage dann ruhig neue Rückmeldung

Die Variable bild ist dort nicht bekannt. Auch wenn man die Latte hier in einem Forum etwas niedriger legen kann: Bestimmte Sachen sollten nicht hier erklärt werden müssen.

void foo() {
    int x = 32;
}
void bar() {
    System.out.println(x); // x ist hier nicht bekannt
}

Es gäbe mehrere mögliche ““Abhilfen””, aber dann stellt sich sofort die Frage, wie weit das ganze von der Struktur her in eine sinnvolle Richtung geschoben werden soll. Hattest du meine Lösung ausprobiert?