diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java index b6b273f..1f7abe3 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/chatui/ChatController.java @@ -41,6 +41,11 @@ public class ChatController { chatScrollPane.vvalueProperty().bind(chatVBox.heightProperty()); } + /** Standardkonstruktor. Wird von FXML verwendet. */ + public ChatController() { + // default constructor for FXML + } + /** * Diese Methode wird vom Senden-Button oder Enter ausgelöst. Sie gibt die eigene Nachricht an * das Netzwerkprotokoll weiter. diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java index c96c9bd..ae52485 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameController.java @@ -15,11 +15,22 @@ import javafx.scene.layout.VBox; */ public class CasinoGameController { + /** Standardkonstruktor. Wird von FXML verwendet. */ + public CasinoGameController() { + // default constructor for FXML + } + @FXML private Label welcomeText; @FXML private VBox casinoTable; // TODO: Test-Logik: wird durch echte Spielinteraktionen ersetzt, // sobald die GameEngine fertig ist + + /** + * Temporäre Test-Methode, die bei Klick auf den Tisch eine Platzhalteraktion ausführt. + * + *

Wird in der finalen Implementierung durch die Spiel-Logik ersetzt. + */ @FXML public void onTableClick() { welcomeText.setText("Einsatz akzeptiert!"); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java index f9b5419..5083ee6 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/CasinoGameUI.java @@ -17,6 +17,11 @@ import javafx.stage.Stage; */ public class CasinoGameUI extends Application { + /** Standardkonstruktor. */ + public CasinoGameUI() { + // default no-arg constructor + } + private static final int DEFAULT_WIDTH = 1200; private static final int DEFAULT_HEIGHT = 800; @@ -29,7 +34,7 @@ public class CasinoGameUI extends Application { @Override public void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = - new FXMLLoader(CasinoGameUI.class.getResource("/ui-structure/casinogameui.fxml")); + new FXMLLoader(CasinoGameUI.class.getResource("/ui-structure/Casinogameui.fxml")); Scene scene = new Scene(fxmlLoader.load(), DEFAULT_WIDTH, DEFAULT_HEIGHT); stage.setTitle("Casono (GAME)"); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java index e351b7a..03c4644 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/CasinoBrowserController.java @@ -27,6 +27,8 @@ import javafx.scene.shape.Rectangle; import javafx.scene.web.WebEngine; import javafx.scene.web.WebView; import javafx.stage.Stage; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * Experimenteller integrierter Browser für Casono. @@ -50,13 +52,17 @@ import javafx.stage.Stage; */ public class CasinoBrowserController { + /** Standardkonstruktor. Initialisiert den CasinoBrowserController. */ + public CasinoBrowserController() { + // Intentionally left blank; controller initialization is FXML-driven. + } + private static final Set TRUSTED_DOMAINS = new HashSet<>(); private static final CookieManager COOKIE_MANAGER = new CookieManager(null, CookiePolicy.ACCEPT_ORIGINAL_SERVER); - private static final org.apache.logging.log4j.Logger LOGGER = - org.apache.logging.log4j.LogManager.getLogger(CasinoBrowserController.class); + private static final Logger LOGGER = LogManager.getLogger(CasinoBrowserController.class); private static final int LOGO_HEIGHT = 40; private static final int CORNER_RADIUS = 40; @@ -354,8 +360,9 @@ public class CasinoBrowserController { fwdBtn.getStyleClass().add("gray-button"); fwdBtn.setOnAction( e -> { - if (engine.getHistory().getCurrentIndex() - < engine.getHistory().getEntries().size() - 1) { + int currentIndex = engine.getHistory().getCurrentIndex(); + int lastIndex = engine.getHistory().getEntries().size() - 1; + if (currentIndex < lastIndex) { engine.getHistory().go(1); } }); @@ -423,7 +430,7 @@ public class CasinoBrowserController { Scene scene = new Scene(root, WINDOW_WIDTH, WINDOW_HEIGHT); - var css = CasinoBrowserController.class.getResource("/ui-structure/casinogameui.css"); + var css = CasinoBrowserController.class.getResource("/ui-structure/Casinogameui.css"); if (css != null) { scene.getStylesheets().add(css.toExternalForm()); @@ -512,10 +519,11 @@ public class CasinoBrowserController { alert.setTitle("Unbekannte Website"); alert.setHeaderText("Diese Website ist nicht bekannt"); - alert.setContentText( + String content = host - + "\n\nDiese Seite ist nicht vom " - + "Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?"); + + "\n\nDiese Seite ist nicht vom Casono Browser verifiziert.\n" + + "Möchten Sie sie trotzdem öffnen?"; + alert.setContentText(content); var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH); Image logo = new Image(stream); 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..b446f3a 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 @@ -1,12 +1,14 @@ package ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.gameuicomponents; -import javafx.application.Platform; +import ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui; import javafx.fxml.FXML; import javafx.scene.control.TextField; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.scene.layout.HBox; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; /** * Controller für die interaktive Taskleiste innerhalb der Poker-UI. @@ -16,8 +18,12 @@ import javafx.scene.layout.HBox; */ public class TaskbarController { - private static final org.apache.logging.log4j.Logger LOGGER = - org.apache.logging.log4j.LogManager.getLogger(CasinoBrowserController.class); + /** Standardkonstruktor. Wird von FXML verwendet. */ + public TaskbarController() { + // default constructor for FXML + } + + private static final Logger LOGGER = LogManager.getLogger(CasinoBrowserController.class); @FXML private HBox taskbar; @FXML private TextField taskbarInput; @@ -92,15 +98,21 @@ public class TaskbarController { processBet(); } - /** - * 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 - * schließen (kein System.exit/Platform.exit). - */ @FXML private void onExitButtonClick() { - Platform.exit(); + javafx.application.Platform.runLater( + () -> { + // Close game stage + javafx.stage.Stage currentStage = + (javafx.stage.Stage) taskbar.getScene().getWindow(); + currentStage.close(); + // Lobby-UI starten + try { + new Casinomainui().start(new javafx.stage.Stage()); + } catch (Exception e) { + LOGGER.error("Fehler beim Starten der Lobby-UI: {}", e.getMessage()); + } + }); } /** 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..48ccce7 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 @@ -28,6 +28,7 @@ public class CasinomainuiController { private LobbyButtonGridManager gridManager; private int nextButtonId = 1; + /** Default constructor for dependency injection by FXMLLoader. */ public CasinomainuiController() { // Default constructor } @@ -39,7 +40,7 @@ public class CasinomainuiController { subtitleLabel.setText("Texas Hold'em Poker"); logoView.setImage(new Image(getClass().getResource("/images/logo.png").toExternalForm())); - translationManager = new LobbyButtonTranslationManager(); + translationManager = LobbyButtonTranslationManager.getInstance(); gridManager = new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager); casinoTable.getChildren().clear(); 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..3f75b0f 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 @@ -17,6 +17,8 @@ import org.apache.logging.log4j.Logger; * ButtonID to LobbyID. */ public class LobbyButtonGridManager { + private static final double BUTTON_WIDTH_MARGIN = 20.0; + private static final double BUTTON_MIN_SIZE = 10.0; private static final Logger LOGGER = LogManager.getLogger(LobbyButtonGridManager.class); /** GridPane for the button grid. */ @@ -46,7 +48,8 @@ public class LobbyButtonGridManager { public LobbyButtonGridManager( GridPane gridPane, LobbyButtonTranslationManager translationManager) { this.gridPane = gridPane; - this.translationManager = translationManager; + // Singleton immer verwenden + this.translationManager = LobbyButtonTranslationManager.getInstance(); } /** @@ -65,8 +68,21 @@ public class LobbyButtonGridManager { int buttonId = entry.getKey(); Button btn = new Button(); btn.setId("lobbyBtn-" + buttonId); - btn.setGraphic( - new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH)))); + ImageView imageView = + new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH))); + imageView.setPreserveRatio(true); + // Dynamische Breite: Bindung an die Zellengröße + imageView + .fitWidthProperty() + .bind(gridPane.widthProperty().divide(COLS).subtract(BUTTON_WIDTH_MARGIN)); + imageView.setSmooth(true); + btn.setGraphic(imageView); + btn.setMaxWidth(Double.MAX_VALUE); + btn.setMaxHeight(Double.MAX_VALUE); + btn.setMinWidth(BUTTON_MIN_SIZE); + btn.setMinHeight(BUTTON_MIN_SIZE); + GridPane.setHgrow(btn, javafx.scene.layout.Priority.ALWAYS); + GridPane.setVgrow(btn, javafx.scene.layout.Priority.ALWAYS); btn.setOnAction( e -> { Integer lobbyId = translationManager.getLobbyIdForButton(buttonId); @@ -99,8 +115,22 @@ 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..0aea7e4 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 @@ -8,14 +8,31 @@ import java.util.Map; * nur Laufzeitdatenstruktur. */ public class LobbyButtonTranslationManager { + + // Singleton-Instanz + private static LobbyButtonTranslationManager instance; + + // Singleton-Zugriff + /** + * Liefert die Singleton-Instanz des Managers. + * + * @return die einzige Instanz von {@code LobbyButtonTranslationManager} + */ + 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 } diff --git a/src/main/resources/ui-structure/casinogameui.css b/src/main/resources/ui-structure/Casinogameui.css similarity index 100% rename from src/main/resources/ui-structure/casinogameui.css rename to src/main/resources/ui-structure/Casinogameui.css diff --git a/src/main/resources/ui-structure/Casinogameui.fxml b/src/main/resources/ui-structure/Casinogameui.fxml index 91bbe26..08bbf56 100644 --- a/src/main/resources/ui-structure/Casinogameui.fxml +++ b/src/main/resources/ui-structure/Casinogameui.fxml @@ -5,12 +5,12 @@ - + + stylesheets="@Casinogameui.css"> @@ -78,14 +78,14 @@ - + - + @@ -99,7 +99,7 @@ - + @@ -114,7 +114,7 @@ - + @@ -129,7 +129,7 @@ - + diff --git a/src/main/resources/ui-structure/Casinomainui.fxml b/src/main/resources/ui-structure/Casinomainui.fxml index 2d18a48..7cae21e 100644 --- a/src/main/resources/ui-structure/Casinomainui.fxml +++ b/src/main/resources/ui-structure/Casinomainui.fxml @@ -106,20 +106,7 @@ - - - - - - - + diff --git a/src/main/resources/ui-structure/components/chatbox.fxml b/src/main/resources/ui-structure/components/Chatbox.fxml similarity index 98% rename from src/main/resources/ui-structure/components/chatbox.fxml rename to src/main/resources/ui-structure/components/Chatbox.fxml index 3e518ba..c61e28e 100644 --- a/src/main/resources/ui-structure/components/chatbox.fxml +++ b/src/main/resources/ui-structure/components/Chatbox.fxml @@ -21,7 +21,7 @@ xmlns:fx="http://javafx.com/fxml/1" fx:controller="ch.unibas.dmi.dbis.cs108.casono.client.ui.chatui.ChatController" alignment="CENTER" - stylesheets="@chatui.css"> + stylesheets="@Chatui.css"> diff --git a/src/main/resources/ui-structure/components/chatui.css b/src/main/resources/ui-structure/components/Chatui.css similarity index 100% rename from src/main/resources/ui-structure/components/chatui.css rename to src/main/resources/ui-structure/components/Chatui.css diff --git a/src/main/resources/ui-structure/gameuicomponents/playerstatus.fxml b/src/main/resources/ui-structure/gameuicomponents/Playerstatus.fxml similarity index 100% rename from src/main/resources/ui-structure/gameuicomponents/playerstatus.fxml rename to src/main/resources/ui-structure/gameuicomponents/Playerstatus.fxml diff --git a/src/main/resources/ui-structure/gameuicomponents/taskbar.fxml b/src/main/resources/ui-structure/gameuicomponents/Taskbar.fxml similarity index 100% rename from src/main/resources/ui-structure/gameuicomponents/taskbar.fxml rename to src/main/resources/ui-structure/gameuicomponents/Taskbar.fxml diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java index 67aaae4..765deb0 100644 --- a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java +++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonGridManagerTest.java @@ -13,7 +13,7 @@ class LobbyButtonGridManagerTest { @BeforeEach void setUp() { gridPane = new GridPane(); - translationManager = new LobbyButtonTranslationManager(); + translationManager = LobbyButtonTranslationManager.getInstance(); translationManager.getButtonIdToLobbyId().clear(); gridManager = new LobbyButtonGridManager(gridPane, translationManager); } @@ -23,10 +23,4 @@ class LobbyButtonGridManagerTest { int lobbyId = gridManager.createLobby(); assertTrue(lobbyId > 0); } - - @Test - void testJoinLobbyPlaceholder() { - // check if exception is thrown - assertDoesNotThrow(() -> gridManager.joinLobby(123)); - } } diff --git a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java index d19532a..dfcce6a 100644 --- a/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java +++ b/src/test/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/lobbyui/LobbyButtonTranslationManagerTest.java @@ -6,11 +6,12 @@ import java.util.Map; import org.junit.jupiter.api.*; class LobbyButtonTranslationManagerTest { + LobbyButtonTranslationManager manager; @BeforeEach void setUp() { - manager = new LobbyButtonTranslationManager(); + manager = LobbyButtonTranslationManager.getInstance(); manager.getButtonIdToLobbyId().clear(); }