Frage von BuBBles2904, 21

Hauptmenü zu Spiel nachträglich programmieren?

Hallo!

Ich habe Pong mit Java programmiert, bin auch ganz zufrieden und jetzt würde ich dem Spiel gerne noch ein Hauptmenü hinzufügen, also ein weiteres Frame, auf dem man zwei Buttons zum Spiel starten und Spiel beenden hat. Mein erstes Problem ist: Ich habe ein JFrame für mein Hauptmenü erstellt und JButtons hinzugefügt, aber sie tauchen nicht auf. Mein Code:

package pack1;

import java.awt.event.*; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel;

public class Menu extends JPanel implements ActionListener{

public Menu() {
    
    Var.menu = new JFrame();
    Var.menu.setSize(Var.menuWidth, Var.menuHeight);
    Var.menu.setTitle("Hauptmenü");
    Var.menu.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    Var.menu.setLayout(null);
    Var.menu.setResizable(false);
    Var.menu.setLocationRelativeTo(null);
    Var.menu.setVisible(true);
    Var.menu.requestFocus();
    
    Var.start = new JButton("Spiel starten");
    Var.start.setBounds(120, 40, Var.menuWidth/2 -120, Var.menuHeight/2);
    Var.start.addActionListener(this);
    add(Var.start);
    
    Var.end = new JButton ("Spiel beenden");
    Var.end.setBounds(120, 40, Var.menuWidth/2 -120, Var.menuHeight/2 - 120);
    Var.end.addActionListener(this);
    add(Var.end);
}
@Override
public void actionPerformed(ActionEvent e) {
    
    if (e.getSource() == Var.start){
        Main.play();
    }
    
    if (e.getSource()== Var.end) {
        System.exit(0);
    }
}

}

Meine Variablen habe ich in die Klasse Var ausgelagert. Main.play() soll am Ende bewirken, dass das Spiel ausgeführt wird. Das Spiel selbst ist in vielen verschiedenen Klassen programmiert. Etwas kompliziert zu erklären.. Wenn ich jetzt auf ausführen klicke, startet mein Spiel. Wenn ich das Fenster zur Seite ziehe wurde das Fenster Menu auch erstellt - aber ohne die Buttons. Wieso sind sie nicht da? Kann mir da jemand helfen?

Mein zweites Problem: Ich möchte erreichen, dass sich ERST das Hauptmenü "Menu" öffnet und das Spiel NUR, wenn ich auf den "Spiel starten"-Button geklickt habe. Wie gehe ich da ran?

Tut mir leid, wenn es etwas kompliziert geschrieben ist, ich habe versucht, es möglichst anschaulich zu machen Danke an alle, die versuchen, mir zu helfen!

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von regex9, 14
Var.menu = new JFrame();
// ...
add(Var.start);

Wieso erzeugst du diesen neuen Frame und wo hängst du den Button da nun an?

Außerdem solltest du LayoutManager verwenden, um dein Layout aufzubauen.

Kommentar von BuBBles2904 ,

also ich bin noch ein ziemlicher Anfänger und habe das Spiel mithilfe eines Tutorials auf YouTube programmiert.

Was genau ist denn der LayoutManager?

Kommentar von regex9 ,

Als Anfänger solltest du dich erst einmal mit den Grundlagen beschäftigen, bevor du zur GUI-Programmierung übergehst. Auch wenn es langweiliger erscheinen mag.

Youtube-Videos (zumindest wie diese) solltest du meiden. Das Outsourcing von Variablen auf diese Art und Weise ist entgegen des objektorientierten Prinzips. In der objektorientierten Programmierung geht es darum, logisch in Objekte und Klassen zu unterteilen. Ein Objekt beschreibt einen konkreten Zustand und übernimmt eine konkrete Funktion. So gäbe es bei dir eine Instanz der Klasse Menü, die Eigenschaften der Superklasse JFrame erbt und sich gänzlich nur der Funktion des Menüs widmet. Genauso hast du weitere Steuerelemente, die bereits bestehen, wie den JButton. Dieser stellt ebenso eine abgeschlossene Einheit für sich dar. Alle Zustände (Attribute und Methoden) die er benötigt, trägt er bei sich, nicht woanders (in einer Klasse Var). Zudem setzt sich deine Lösung über das Prinzip der Kapselung hinweg. Die Attribute von Var sind alle öffentlich zugänglich und das Schlüsselwort static wird ebenso gedankenlos missbraucht. Die Grundsätze der objektorientierten Programmierung sollten aber beachtet werden, wenn man ein gutes Programm schreiben möchte, dass seine Anforderungen erfüllen soll (Einfachheit, Wartbarkeit, Funktionalität, etc.).

Du hast momentan einen Logikfehler im Programm. Mit der add-Methode fügst du den Button deinem Panel hinzu (also der Klasse Menu). Nicht dem Frame, dessen Referenz du in Var.menu abgelegt hast. Richtig wäre es so:

Var.menu.add(Var.start);

Bezüglich der Layout Manager findest du hier eine gute Übersicht: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

Kommentar von BuBBles2904 ,

Danke für die ausführliche Antwort! Ich muss eben noch viel lernen und werde mir deine Tipps auf jeden Fall zu Herzen nehmen! :) Der Link ist sehr hilfreich und ich werde mich gleich mal damit auseinander setzen. Danke!

Antwort
von Borgler94, 14

wieso lagerst du Variablen aus?... ist ein sehr ungewöhnlicher Programmierstil 

kannst du bitte dein gesamtes Projekt als zip hier hochladen und den link schicken

https://wetransfer.com/

(bei "send as" 'link' auswählen)

Kommentar von BuBBles2904 ,

ich habe das Spiel mit Hilfe eines Tutorials auf YouTube programmiert, um zu üben und versuchen es zu verstehen und da wurden die Variablen ausgelagert.

Nächstes Wochenende kann ich das Projekt hochladen, derzeit befindet es sich auf einem anderen PC, den ich leider in der Woche nciht zur Verfügung habe

Kommentar von regex9 ,

Dies ist einer der vielen Gründe, wieso ich von Youtube-Tutorials abrate.

Kommentar von Borgler94 ,

ich würde ehrlich gesagt das gesamte Projekt verwerfen und noch einmal neu, objektorientiert starten ...

Keine passende Antwort gefunden?

Fragen Sie die Community