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..620a248 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 @@ -7,19 +7,40 @@ import javafx.scene.layout.VBox; /** * Controller für die Casino-Spielfläche. * - *
Verantwortlich für: - die Darstellung des Pokertisches und der Spieleroberfläche, - die - * Verarbeitung von Benutzereingaben, - die Schnittstelle zur GameEngine und zum Netzwerkprotokoll. + *
+ * Verantwortlich für: - die Darstellung des Pokertisches und der + * Spieleroberfläche, - die + * Verarbeitung von Benutzereingaben, - die Schnittstelle zur GameEngine und zum + * Netzwerkprotokoll. * - *
Hinweise: - Die Methode `onTableClick()` dient aktuell nur als Test-Logik. Sie ist ggf. nicht - * mehr funktionsfähig und wird zukünftig durch die finale Spielinteraktion ersetzt. + *
+ * Hinweise: - Die Methode `onTableClick()` dient aktuell nur als Test-Logik. + * Sie ist ggf. nicht + * mehr funktionsfähig und wird zukünftig durch die finale Spielinteraktion + * ersetzt. */ public class CasinoGameController { - @FXML private Label welcomeText; - @FXML private VBox casinoTable; + /** 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..7dd6526 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
@@ -50,6 +50,10 @@ 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 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);
+ /** Standardkonstruktor. Wird von FXML verwendet. */
+ public TaskbarController() {
+ // default constructor for FXML
+ }
- @FXML private HBox taskbar;
- @FXML private TextField taskbarInput;
+ private static final Logger LOGGER = LogManager.getLogger(CasinoBrowserController.class);
+
+ @FXML
+ private HBox taskbar;
+ @FXML
+ private TextField taskbarInput;
private double xOffset = 0;
private double yOffset = 0;
@@ -30,7 +40,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 +53,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 +74,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 +99,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
@@ -92,20 +108,27 @@ 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(
+ () -> {
+ // Game-Stage schließen
+ 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());
+ }
+ });
}
/**
- * 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 +151,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..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