From 936967e80929ae0c4c76ea3d3e2065a6011d20d4 Mon Sep 17 00:00:00 2001 From: Vickvick2002 Date: Fri, 3 Jan 2025 13:39:40 +0100 Subject: [PATCH] StartMenu Klasse verbessert --- .../java/PR2/HitoriSpiel/GUI/StartMenu.java | 143 ++++++++++++++---- 1 file changed, 115 insertions(+), 28 deletions(-) diff --git a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/StartMenu.java b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/StartMenu.java index 7d88a1c..15b8851 100644 --- a/Hitori/src/main/java/PR2/HitoriSpiel/GUI/StartMenu.java +++ b/Hitori/src/main/java/PR2/HitoriSpiel/GUI/StartMenu.java @@ -1,52 +1,139 @@ -package PR2.HitoriSpiel.GUI; +package GUI; + +import domain.HitoriBoard; +import persistent.BoardLoader; import javax.swing.*; import java.awt.*; +import java.io.File; +import java.io.InputStream; +import java.util.List; -public class StartMenu extends JPanel { +public class StartMenu extends JFrame { + private JPanel mainPanel; + + public StartMenu() { + setTitle("Hitori - Hauptmenü"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(600, 400); + + mainPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.gridx = 0; + gbc.gridy = GridBagConstraints.RELATIVE; + gbc.insets = new Insets(10, 10, 10, 10); + gbc.anchor = GridBagConstraints.CENTER; // Buttons zentrieren + + JLabel titleLabel = new JLabel("Willkommen im Hitori-Spiel!"); + titleLabel.setFont(new Font("Arial", Font.BOLD, 16)); + titleLabel.setHorizontalAlignment(SwingConstants.CENTER); + mainPanel.add(titleLabel, gbc); - public StartMenu(JFrame parentFrame) { - // Layout auf FlowLayout setzen - this.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10)); // Zentriert mit Abständen // Buttons erstellen JButton continueButton = createButton("Spiel fortsetzen", 200, 30); JButton selectBoardButton = createButton("Spielfeld aussuchen", 200, 30); JButton randomBoardButton = createButton("Zufälliges Spielfeld", 200, 30); - JButton highscorelistButton = createButton("Highscoreliste anzeigen", 200, 30); + JButton highscorelistButton = createButton("Highscoreliste anschauen", 200, 30); JButton exitButton = createButton("Spiel beenden", 200, 30); - // Namen für AssertJ-Swing setzen - continueButton.setName("continueButton"); - selectBoardButton.setName("selectBoardButton"); - randomBoardButton.setName("randomBoardButton"); - highscorelistButton.setName("highscorelistButton"); - exitButton.setName("exitButton"); - // ActionListener hinzufügen - continueButton.addActionListener(e -> showMessage("Spiel fortsetzen wird implementiert.")); - selectBoardButton.addActionListener(e -> showMessage("Spielfeld auswählen wird implementiert.")); - randomBoardButton.addActionListener(e -> showMessage("Zufälliges Spielfeld wird gestartet.")); - highscorelistButton.addActionListener(e -> showMessage("Highscore-Liste wird angezeigt.")); + mainPanel.add(continueButton, gbc); + mainPanel.add(selectBoardButton, gbc); + mainPanel.add(randomBoardButton, gbc); + mainPanel.add(highscorelistButton, gbc); + mainPanel.add(exitButton, gbc); + + continueButton.addActionListener(e -> continueGame()); + selectBoardButton.addActionListener(e -> selectBoard()); + randomBoardButton.addActionListener(e -> randomBoard()); + highscorelistButton.addActionListener(e -> highscorelist()); exitButton.addActionListener(e -> System.exit(0)); - // Buttons zum Panel hinzufügen - this.add(continueButton); - this.add(selectBoardButton); - this.add(randomBoardButton); - this.add(highscorelistButton); - this.add(exitButton); + add(mainPanel); + setVisible(true); + setLocationRelativeTo(null); } - // Methode zum Anzeigen von Nachrichten - private void showMessage(String message) { - JOptionPane.showMessageDialog(this, message, "Info", JOptionPane.INFORMATION_MESSAGE); + private void continueGame() { + // TODO: Logik zum Fortsetzen des Spiels implementieren + JOptionPane.showMessageDialog(this, "Spiel fortsetzen wurde angeklickt"); } - // Methode zum Erstellen von Buttons mit fester Größe + private void selectBoard() { + + // Lade die Liste der Spielfeld-Dateien + List boardFileNames = BoardLoader.loadBoardsAsList(); + + if (boardFileNames.isEmpty()) { + JOptionPane.showMessageDialog(this, "Keine Spielfelder gefunden.", "Information", JOptionPane.INFORMATION_MESSAGE); + return; + } + + // Erstelle die JComboBox + JComboBox boardSelector = new JComboBox<>(boardFileNames.toArray(new String[0])); + boardSelector.setPreferredSize(new Dimension(250, 30)); // Größe der ComboBox anpassen + + JPanel selectionPanel = new JPanel(new BorderLayout()); + selectionPanel.add(new JLabel("Wähle ein Spielfeld:"), BorderLayout.NORTH); + selectionPanel.add(boardSelector, BorderLayout.CENTER); + + // Zeige das Auswahlfenster + int option = JOptionPane.showConfirmDialog( + this, + selectionPanel, + "Spielfeld auswählen", + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.PLAIN_MESSAGE + ); + + // Aktion, wenn der Benutzer auf OK klickt + if (option == JOptionPane.OK_OPTION) { + String selectedFile = (String) boardSelector.getSelectedItem(); + if (selectedFile != null) { + try { + + InputStream inputStream = BoardLoader.class.getResourceAsStream("/persistent/Hitori_Spielfelder/" + selectedFile); + if (inputStream == null) { + throw new Exception("Ressourcendatei nicht gefunden: /persistent/Hitori_Spielfelder/" + selectedFile); + } + // Lade das ausgewählte Spielfeld + int[][] boardData = BoardLoader.loadBoard("/persistent/Hitori_Spielfelder/" + selectedFile); + + + + loadGameBoard(boardData); // Zeige das Spielfeld an + } catch (Exception ex) { + JOptionPane.showMessageDialog(this, "Fehler beim Laden des Spielfelds: " + ex.getMessage(), "Fehler", JOptionPane.ERROR_MESSAGE); + } + } + } + } + + private void randomBoard() { + // TODO: Logik zum Auswählen eines zufälligen Spielfeldes implementieren + JOptionPane.showMessageDialog(this, "Zufälliges Spielfeld wurde angeklickt"); + } + + private void highscorelist() { + // TODO: Logik zur Anzeige der Highscoreliste implementieren + JOptionPane.showMessageDialog(this, "Highscoreliste wurde angeklickt"); + } + + // Hilfsmethoden private JButton createButton(String text, int width, int height) { JButton button = new JButton(text); - button.setPreferredSize(new Dimension(width, height)); // Feste Größe setzen + button.setPreferredSize(new Dimension(width, height)); return button; } + + private void loadGameBoard(int[][] boardData) { + // Neues Panel für das Spielfeld + mainPanel.removeAll(); + mainPanel.setLayout(new BorderLayout()); + mainPanel.add(new GameBoard(new HitoriBoard(boardData, List.of())), BorderLayout.CENTER); + mainPanel.revalidate(); + mainPanel.repaint(); + } + }