+ Antworten
Ergebnis 1 bis 6 von 6

Thema: Jframe schließen wenn neues Jframe geöffnet wird

  1. #1
    New User Bit Themenstarter

    Registriert seit
    29.11.2016
    Fachbeiträge
    2
    Genannt
    0 Post(s)
    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
    Java Code:
    1.  
    2. package monopoly;
    3.  
    4. import java.awt.Color;
    5. import java.awt.Component;
    6. import java.awt.Font;
    7. import java.awt.Graphics;
    8. import java.awt.Graphics2D;
    9. import java.awt.Image;
    10. import java.awt.event.ActionEvent;
    11. import java.awt.event.ActionListener;
    12.  
    13. import javax.swing.ImageIcon;
    14. import javax.swing.JButton;
    15. import javax.swing.JFrame;
    16. import javax.swing.JLabel;
    17. import javax.swing.JOptionPane;
    18. import javax.swing.JPanel;
    19.  
    20. public class Menue extends JFrame implements ActionListener  {
    21.  
    22.     private JButton schließen;
    23.     private JButton einstellungen;
    24.     private JButton credits;
    25.     private JButton ende;
    26.     private JButton regeln;
    27.     Image Startbild;
    28.  
    29.     public static void main(String[] args) {
    30.  
    31.         Menue bild = new Menue("Monopoly");
    32.         bild.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    33.         bild.setSize(1280,980);
    34.         bild.setResizable(false);
    35.         bild.setLocationRelativeTo(null);
    36.         bild.setLayout(null);
    37.         bild.setVisible(true);
    38.         bild.getContentPane().setBackground(Color.black);
    39.     }
    40.  
    41.     public Menue(String title) {
    42.  
    43.         super(title);
    44.         Font myFont = new Font("Arial", Font.BOLD, 30);
    45.  
    46.         schließen = new JButton("Spiel starten");
    47.         schließen.setBounds(512, 340, 256, 136);
    48.         schließen.addActionListener(this);
    49.         schließen.setFont(myFont);
    50.         add(schließen);
    51.  
    52.         einstellungen = new JButton("Einstellungen");
    53.         einstellungen.setBounds(256,540,256,136);
    54.         einstellungen.addActionListener(this);
    55.         einstellungen.setFont(myFont);
    56.         add(einstellungen);
    57.  
    58.         regeln = new JButton("Regeln");
    59.         regeln.setBounds(768,540,256,136);
    60.         regeln.addActionListener(this);
    61.         regeln.setFont(myFont);
    62.         add(regeln);
    63.  
    64.         ende = new JButton("Ende");
    65.         ende.setBounds(256,740,256,136);
    66.         ende.addActionListener(this);
    67.         ende.setFont(myFont);
    68.         add(ende);
    69.  
    70.         credits = new JButton("Credits");
    71.         credits.setBounds(768,740,256,136);
    72.         credits.addActionListener(this);
    73.         credits.setFont(myFont);
    74.         add(credits);
    75.  
    76.         ImageIcon u = new ImageIcon(getClass().getResource("Startbild.png"));
    77.         Startbild = u.getImage();
    78.     }
    79.  
    80.     public void paint (Graphics g){
    81.  
    82.         super.paint(g);
    83.         Graphics2D g2d = (Graphics2D) g;
    84.  
    85.         g2d.drawImage(Startbild,320,0,null);
    86.     }
    87.  
    88.     public void actionPerformed(ActionEvent e){
    89.  
    90.         if (e.getSource() == schließen){
    91.             fenster();
    92.         }
    93.  
    94.         if (e.getSource() == credits){
    95.             Object[] options = { "Ok"};
    96.             JOptionPane.showOptionDialog(null, "Programmiert von Philipp und Julian", "Information",
    97.                 JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE,
    98.                 null, options, options[0]);
    99.         }
    100.  
    101.         if (e.getSource() == einstellungen){
    102.             Object[] options = { "OK"};
    103.             JOptionPane.showOptionDialog(null, "Hier können sie Einstellungen vornehmen", "Information",
    104.                 JOptionPane.DEFAULT_OPTION, JOptionPane.PLAIN_MESSAGE,
    105.                 null, options, options[0]);
    106.         }
    107.         if(e.getSource()== regeln)
    108.         {
    109.             JOptionPane.showMessageDialog(null, "Hier stehen mal die Regeln wenn einer bock hat sie hin zu schreiben bei Julian melden gibt auch kekse");
    110.         }
    111.  
    112.         if (e.getSource() == ende){
    113.             System.exit(0);
    114.         }
    115.     }
    116.  
    117.     public static void fenster() {
    118.  
    119.         JFrame fenster = new JFrame("Game");
    120.         fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    121.         fenster.setSize(1000,1000);
    122.         fenster.setVisible(true);
    123.         //fenster.getContentPane().setBackground(Color.black);
    124.         //fenster.setLayout(null);
    125.         fenster.add(new gui());
    126.     }
    127.  
    128. }

    Vielen dank für die Hilfe im voraus.
    Geändert von Marco13 (29.11.2016 um 20:54 Uhr) Grund: Das formatieren kommt vor dem matieren

  2. #2
    Global Moderator Viertel Gigabyte Avatar von SlaterB
    Registriert seit
    06.08.2008
    Fachbeiträge
    2.695
    Genannt
    275 Post(s)
    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
    Hansa wird Meister

  3. Es bedanken sich:
    Pheanox (29.11.2016)
  4. #3
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.901
    Genannt
    307 Post(s)
    Schon durch
    Java Code:
    1.  
    2.         if (e.getSource() == schließen){
    3.             setVisible(false);                 // <---- das hier
    4.             fenster();
    5.         }
    wäre vermutlich das erreicht, was erreicht werden soll.

    Ansonsten .... ist das natürlich alles kagge

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

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

    • Variablennamen sinnvoller machen! Keine Umlaute in Variablennamen! (Am besten Englische Namen, auch für Klassen - es ist einfach besser)
    • Man sollte üblicherweise nicht von JFrame erben. Die "Haupt-GUI-Klasse" sollte bestenfalls von JPanel erben
    • 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
    • Kein null-Layout verwenden, keine händischen "setBounds"-Aufrufe machen! Stattdessen einen LayoutManager verwenden: https://docs.oracle.com/javase/tutor...out/using.html
    • 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:
      Java Code:
      1.  
      2. void createGui()
      3. {
      4.     ...
      5.     JButton startGameButton = new JButton("Start game");
      6.     startGameButton.addActionListener(e -> startGame()); // "Beim Klick diese Methode ausführen"
      7.    
      8.     ...
      9. }
      10. 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.

  5. Es bedanken sich:
    Pheanox (29.11.2016)
  6. #4
    New User Bit Themenstarter

    Registriert seit
    29.11.2016
    Fachbeiträge
    2
    Genannt
    0 Post(s)
    Danke erstmal für die Hinweiße konnte manche davon umsetzten.
    Ich versuch jetzt mal meine Frgae im code zu stellen
    Java Code:
    1.  
    2. public static void main(String[] args) {
    3.        
    4.         Menue bild = new Menue("Monopoly");
    5.         bild.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    6.         bild.setSize(1280,980);
    7.         bild.setResizable(false);
    8.         bild.setLocationRelativeTo(null);
    9.         bild.setLayout(null);
    10.         bild.setVisible(true);
    11.         bild.getContentPane().setBackground(Color.black);
    12.        
    13. }
    Hier erstelle ich ja mein erstes JFrame ( Menü )
    Java Code:
    1.  
    2. public void actionPerformed(ActionEvent e){
    3.        
    4.         if (e.getSource() == schliessen){
    5.             fenster();  // Hier wird dann das Spiel gestartet also der 2 JFrame und jetzt soll der 1. Jframe unsichtbar sein
    6.                         bild.setvisible(false)// das geht aber nicht mir auch klar warum aber wie mache ich es dann?
    7.            
    8.            
    9.            
    10.         }

  7. #5
    Global Moderator Viertel Gigabyte Avatar von SlaterB
    Registriert seit
    06.08.2008
    Fachbeiträge
    2.695
    Genannt
    275 Post(s)
    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
    Hansa wird Meister

  8. #6
    Global Moderator Viertel Gigabyte
    Registriert seit
    05.08.2008
    Fachbeiträge
    4.901
    Genannt
    307 Post(s)
    Zitat Zitat von Pheanox Beitrag anzeigen
    Ich versuch jetzt mal meine Frgae im code zu stellen
    Java Code:
    1.  
    2.                         bild.setvisible(false)// das geht aber nicht mir auch klar warum aber wie mache ich es dann?
    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.
    Java Code:
    1.  
    2. void foo() {
    3.     int x = 32;
    4. }
    5. void bar() {
    6.     System.out.println(x); // x ist hier nicht bekannt
    7. }
    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?

+ Antworten Thema als "gelöst" markieren

Direkt antworten Direkt antworten

Nenne eine bekannte Programmiersprache!

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Hauptfenster (GUI) schließen, wenn ein 'Thread' noch läuft
    Von mla.rue im Forum AWT, Swing, JavaFX & SWT
    Antworten: 6
    Letzter Beitrag: 17.01.2014, 09:18
  2. JFrame einpassen
    Von spellsleeper im Forum AWT, Swing, JavaFX & SWT
    Antworten: 5
    Letzter Beitrag: 25.12.2013, 13:01
  3. (Swing) JFrame Bildschirmwechsel
    Von vanny im Forum AWT, Swing, JavaFX & SWT
    Antworten: 0
    Letzter Beitrag: 30.09.2013, 23:13
  4. JFrame
    Von jona im Forum AWT, Swing, JavaFX & SWT
    Antworten: 2
    Letzter Beitrag: 25.09.2009, 16:16
  5. JFrame A durch JFrame B zerstören?
    Von Vril im Forum AWT, Swing, JavaFX & SWT
    Antworten: 8
    Letzter Beitrag: 10.09.2006, 13:21

Stichworte

Berechtigungen

  • Neue Themen erstellen: Ja
  • Themen beantworten: Ja
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •