From 08b85af147e9f3f83add2b5bd1bfb8e013498d01 Mon Sep 17 00:00:00 2001 From: Jona Walpert Date: Thu, 19 Mar 2026 12:54:06 +0100 Subject: [PATCH] Add: Add: Singleton for LobbyButtonTranslationManager and changing exit button behaviour --- .../gameuicomponents/TaskbarController.java | 56 ++++++++++++++----- .../ui/lobbyui/CasinomainuiController.java | 31 ++++++---- .../ui/lobbyui/LobbyButtonGridManager.java | 24 ++++++-- .../LobbyButtonTranslationManager.java | 23 ++++++-- 4 files changed, 99 insertions(+), 35 deletions(-) diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java index 33e1e32..1c31b05 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/TaskbarController.java @@ -11,16 +11,20 @@ import javafx.scene.layout.HBox; /** * Controller für die interaktive Taskleiste innerhalb der Poker-UI. * - *

Verantwortlich für: - Drag-and-Drop-Verschieben der Taskleiste, - Eingabe und Verwaltung von + *

+ * Verantwortlich für: - Drag-and-Drop-Verschieben der Taskleiste, - Eingabe und + * Verwaltung von * Spieleinsätzen, - Steuerung allgemeiner Menüfunktionen wie Exit. */ public class TaskbarController { - private static final org.apache.logging.log4j.Logger LOGGER = - org.apache.logging.log4j.LogManager.getLogger(CasinoBrowserController.class); + private static final org.apache.logging.log4j.Logger LOGGER = org.apache.logging.log4j.LogManager + .getLogger(CasinoBrowserController.class); - @FXML private HBox taskbar; - @FXML private TextField taskbarInput; + @FXML + private HBox taskbar; + @FXML + private TextField taskbarInput; private double xOffset = 0; private double yOffset = 0; @@ -30,7 +34,8 @@ public class TaskbarController { private static final int CREDIT_STEP = 5; /** - * Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird. Speichert die relative + * Wird aufgerufen, wenn die Taskleiste mit der Maus gedrückt wird. Speichert + * die relative * Position, um später korrekt zu verschieben. * * @param event Das Mausereignis @@ -42,10 +47,13 @@ public class TaskbarController { } /** - * Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird. Aktualisiert die Position + * Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird. + * Aktualisiert die Position * und skaliert die Taskleiste leicht zur visuellen Rückmeldung. * - *

TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem Fenster verschwinden + *

+ * TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem Fenster + * verschwinden * kann. * * @param event Das Mausereignis @@ -60,7 +68,8 @@ public class TaskbarController { } /** - * Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. Setzt die Skalierung der + * Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. Setzt + * die Skalierung der * Taskleiste wieder auf Normalgröße. * * @param event Das Mausereignis @@ -84,7 +93,8 @@ public class TaskbarController { } /** - * Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. Löst die + * Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. Löst + * die * Verarbeitung des Einsatzes aus. */ @FXML @@ -95,17 +105,31 @@ public class TaskbarController { /** * Wird aufgerufen, wenn der Exit-Button in der Taskleiste gedrückt wird. * - *

TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte Anwendung zu + *

+ * TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte + * Anwendung zu * schließen (kein System.exit/Platform.exit). */ @FXML private void onExitButtonClick() { - Platform.exit(); + javafx.application.Platform.runLater(() -> { + // Game-Stage schließen + javafx.stage.Stage currentStage = (javafx.stage.Stage) taskbar.getScene().getWindow(); + currentStage.close(); + // Lobby-UI starten + try { + new ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui().start(new javafx.stage.Stage()); + } catch (Exception e) { + LOGGER.error("Fehler beim Starten der Lobby-UI: {}", e.getMessage()); + } + }); } /** - * Verarbeitet den im Textfeld eingegebenen Einsatz. Es werden ausschließlich ganzzahlige Werte - * im Bereich von 5 bis 100.000 Credits akzeptiert, die einem Vielfachen von 5 entsprechen + * Verarbeitet den im Textfeld eingegebenen Einsatz. Es werden ausschließlich + * ganzzahlige Werte + * im Bereich von 5 bis 100.000 Credits akzeptiert, die einem Vielfachen von 5 + * entsprechen * (5er-Schritte). Der Einsatz wird aktuell nur auf der Konsole ausgegeben. */ private void processBet() { @@ -128,7 +152,9 @@ public class TaskbarController { /** * Öffnet den integrierten Casono Webbrowser. * - *

TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps & Tricks + *

+ * TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps + * & Tricks * Seite), sobald die Inhalte für Strategien und Support bereitstehen. */ @FXML diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java index 56fe07e..ca0e69b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/CasinomainuiController.java @@ -12,17 +12,27 @@ import javafx.scene.shape.Rectangle; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -/** Controller for the Casono main UI lobby. Handles UI initialization and user actions. */ +/** + * Controller for the Casono main UI lobby. Handles UI initialization and user + * actions. + */ public class CasinomainuiController { private static final Logger LOGGER = LogManager.getLogger(CasinomainuiController.class); - @FXML private AnchorPane rootPane; - @FXML private Label titleLabel; - @FXML private Label subtitleLabel; - @FXML private ImageView logoView; - @FXML private Rectangle greenBox; - @FXML private Button exitbutton; - @FXML private VBox casinoTable; + @FXML + private AnchorPane rootPane; + @FXML + private Label titleLabel; + @FXML + private Label subtitleLabel; + @FXML + private ImageView logoView; + @FXML + private Rectangle greenBox; + @FXML + private Button exitbutton; + @FXML + private VBox casinoTable; private LobbyButtonTranslationManager translationManager; private LobbyButtonGridManager gridManager; @@ -39,9 +49,8 @@ public class CasinomainuiController { subtitleLabel.setText("Texas Hold'em Poker"); logoView.setImage(new Image(getClass().getResource("/images/logo.png").toExternalForm())); - translationManager = new LobbyButtonTranslationManager(); - gridManager = - new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager); + translationManager = LobbyButtonTranslationManager.getInstance(); + gridManager = new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager); casinoTable.getChildren().clear(); casinoTable.getChildren().add(gridManager.getGridPane()); gridManager.renderLobbyButtons(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java index 03259a7..f8dbb11 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManager.java @@ -13,7 +13,8 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; /** - * Manages the grid for lobby buttons and rendering. Uses LobbyButtonTranslationManager for mapping + * Manages the grid for lobby buttons and rendering. Uses + * LobbyButtonTranslationManager for mapping * ButtonID to LobbyID. */ public class LobbyButtonGridManager { @@ -40,17 +41,19 @@ public class LobbyButtonGridManager { /** * Constructor for the GridManager. * - * @param gridPane the GridPane for rendering + * @param gridPane the GridPane for rendering * @param translationManager the manager for mapping ButtonID to LobbyID */ public LobbyButtonGridManager( GridPane gridPane, LobbyButtonTranslationManager translationManager) { this.gridPane = gridPane; - this.translationManager = translationManager; + // Singleton immer verwenden + this.translationManager = LobbyButtonTranslationManager.getInstance(); } /** - * Renders all lobby buttons in the grid. Creates a button for each mapping with image and event + * Renders all lobby buttons in the grid. Creates a button for each mapping with + * image and event * handler. */ public void renderLobbyButtons() { @@ -99,8 +102,19 @@ public class LobbyButtonGridManager { * @param lobbyId The lobbyId to join */ public void joinLobby(int lobbyId) { - // TODO: Replace with actual join logic + // Game-UI starten und Lobby-UI schließen LOGGER.info("Joining lobby: {}", lobbyId); + javafx.application.Platform.runLater(() -> { + // Lobby-Stage schließen + javafx.stage.Stage currentStage = (javafx.stage.Stage) gridPane.getScene().getWindow(); + currentStage.close(); + // Game-UI starten + try { + new ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.CasinoGameUI().start(new javafx.stage.Stage()); + } catch (Exception e) { + LOGGER.error("Fehler beim Starten der Game-UI: {}", e.getMessage()); + } + }); } /** diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java index 19af19e..1d6371f 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManager.java @@ -4,18 +4,33 @@ import java.util.HashMap; import java.util.Map; /** - * Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher. Keine Dateioperationen, + * Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher. + * Keine Dateioperationen, * nur Laufzeitdatenstruktur. */ public class LobbyButtonTranslationManager { + + // Singleton-Instanz + private static LobbyButtonTranslationManager instance; + + // Singleton-Zugriff + public static LobbyButtonTranslationManager getInstance() { + if (instance == null) { + instance = new LobbyButtonTranslationManager(); + } + return instance; + } + /** Maximale Anzahl an Buttons/Lobbys */ private static final int MAX_BUTTONS = 8; /** Zuordnung ButtonID → LobbyID */ private final Map buttonIdToLobbyId = new HashMap<>(); - /** Konstruktor: initialisiert die Zuordnung leer. */ - public LobbyButtonTranslationManager() { + /** + * Privater Konstruktor für Singleton-Pattern + */ + private LobbyButtonTranslationManager() { // Zuordnung bleibt leer beim Start } @@ -32,7 +47,7 @@ public class LobbyButtonTranslationManager { * Fügt eine Zuordnung ButtonID → LobbyID hinzu. * * @param buttonId Die ID des Buttons - * @param lobbyId Die ID der Lobby + * @param lobbyId Die ID der Lobby * @throws Exception wenn das Grid voll ist */ public void addLobbyButton(int buttonId, int lobbyId) throws Exception {