Merge branch 'chore/conform-ui-to-checkstyle' into 'main'

Chore/conform ui to checkstyle

See merge request cs108-fs26/Gruppe-13!28
This commit was merged in pull request #184.
This commit is contained in:
Jona Walpert
2026-03-14 17:21:28 +00:00
14 changed files with 333 additions and 344 deletions
@@ -2,24 +2,14 @@ package ch.unibas.dmi.dbis.cs108.casono;
import ch.unibas.dmi.dbis.cs108.casono.client.ClientApp;
import ch.unibas.dmi.dbis.cs108.casono.server.ServerApp;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* Main entry point for Casono application.
* Handles client and server startup.
* <p>
* Standardkonstruktor für die Anwendung.
*/
/** Main entry point for Casono application. Handles client and server startup. */
public final class Main {
/**
* Standardkonstruktor.
*/
public Main() {
// Standardkonstruktor
}
/**
* Main entry point for Casono.
*
* @param args Command line arguments
*/
public static void main(String[] args) {
@@ -50,7 +40,9 @@ public final class Main {
}
private static void printUsage() {
System.err.println("""
Logger logger = LogManager.getLogger(Main.class);
logger.fatal(
"""
Usage:
java -jar xyz.jar server <listenPort>
java -jar xyz.jar client <serverIp>:<serverPort>
@@ -1,26 +1,29 @@
package ch.unibas.dmi.dbis.cs108.casono.client;
/**
* Entry point for the Casono client application.
* Handles client startup and connection parameters.
* Entry point for the Casono client application. Handles client startup and connection parameters.
*/
import ch.unibas.dmi.dbis.cs108.casono.client.ui.Launcher;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* Entry point for the Casono client application.
* Handles client startup and connection parameters.
* <p>
* Standardkonstruktor für die Anwendung.
* Entry point for the Casono client application. Handles client startup and connection parameters.
*
* <p>Standardkonstruktor für die Anwendung.
*/
public class ClientApp {
/**
* Standardkonstruktor.
*/
private static final Logger LOGGER = LogManager.getLogger(ClientApp.class);
/** Standardkonstruktor. */
public ClientApp() {
// Standardkonstruktor
}
/**
* Starts the client application with the given address.
*
* @param arg Address in the format "ip:port".
* @throws IllegalArgumentException if the address format is invalid.
*/
@@ -32,7 +35,7 @@ public class ClientApp {
String host = parts[0];
int port = Integer.parseInt(parts[1]);
System.out.println("You've selected the client. It will connect port " + port + " at host " + host);
Launcher.main(new String[]{});
LOGGER.info("You've selected the client. It will connect port {} at host {}", port, host);
Launcher.main(new String[] {});
}
}
@@ -1,26 +1,26 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui;
import ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui;
import javafx.application.Application;
/**
* Launcher for the Casono main UI.
* <p>
* Standardkonstruktor für die Anwendung.
*
* <p>Standardkonstruktor für die Anwendung.
*/
public class Launcher {
/**
* Standardkonstruktor.
*/
/** Standardkonstruktor. */
public Launcher() {
// Standardkonstruktor
}
/**
* Main entry point for launching the UI.
*
* @param args Command line arguments
*/
public static void main(String[] args) {
Application.launch(ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui.Casinomainui.class, args);
Application.launch(Casinomainui.class, args);
}
}
@@ -12,46 +12,38 @@ import javafx.scene.layout.VBox;
/**
* Controller-Klasse für das Chat-System innerhalb der Spieloberfläche.
*
* Verwaltet das Anzeigen von Chatnachrichten, das Eingabefeld für eigene Nachrichten
* sowie den Senden-Button. Unterstützt drei Arten von Nachrichten:
* - Player-to-Player (Privat)
* - Lobby-Chat (Raum)
* - Globaler Chat (Serverweit)
* <p>Verwaltet das Anzeigen von Chatnachrichten, das Eingabefeld für eigene Nachrichten sowie den
* Senden-Button. Unterstützt drei Arten von Nachrichten: - Player-to-Player (Privat) - Lobby-Chat
* (Raum) - Globaler Chat (Serverweit)
*
* Nachrichten werden in einem {@link VBox}-Container als {@link Label} angezeigt.
* Eigene Nachrichten werden über {@link #onSendToNetwork(String)} an das
* Netzwerkprotokoll weitergeleitet, während eingehende Nachrichten über
* {@link #receiveMessage(String, String)} verarbeitet und angezeigt werden.
* <p>Nachrichten werden in einem {@link VBox}-Container als {@link Label} angezeigt. Eigene
* Nachrichten werden über {@link #onSendToNetwork(String)} an das Netzwerkprotokoll weitergeleitet,
* während eingehende Nachrichten über {@link #receiveMessage(String, String)} verarbeitet und
* angezeigt werden.
*
* Hinweis: Einige TODOs stehen in der zugehörigen FXML-Datei
* <p>Hinweis: Einige TODOs stehen in der zugehörigen FXML-Datei
*/
public class ChatController {
@FXML
private VBox chatVBox;
@FXML private VBox chatVBox;
@FXML
private TextField inputField;
@FXML private TextField inputField;
@FXML
private Button sendButton;
@FXML private Button sendButton;
@FXML
private ScrollPane chatScrollPane;
@FXML private ScrollPane chatScrollPane;
private static final int CHAT_PADDING = 20;
/**
* Initialisiert den ChatController nach dem Laden der FXML.
*/
/** Initialisiert den ChatController nach dem Laden der FXML. */
public void initialize() {
inputField.setOnAction(event -> sendMessage());
chatScrollPane.vvalueProperty().bind(chatVBox.heightProperty());
}
/**
* Diese Methode wird vom Senden-Button oder Enter ausgelöst.
* Sie gibt die eigene Nachricht an das Netzwerkprotokoll weiter.
* Diese Methode wird vom Senden-Button oder Enter ausgelöst. Sie gibt die eigene Nachricht an
* das Netzwerkprotokoll weiter.
*/
@FXML
private void sendMessage() {
@@ -65,8 +57,9 @@ public class ChatController {
}
/**
* Diese Funktion muss vom Netzwerkprotokoll aufgerufen werden,
* wenn eine neue Nachricht von einem anderen Spieler kommt.
* Diese Funktion muss vom Netzwerkprotokoll aufgerufen werden, wenn eine neue Nachricht von
* einem anderen Spieler kommt.
*
* @param player Name des Spielers
* @param message Nachricht des Spielers
*/
@@ -80,8 +73,9 @@ public class ChatController {
}
/**
* Schnittstelle zum Netzwerkprotokoll.
* Diese Funktion wird automatisch aufgerufen, wenn der Benutzer eine eigene Nachricht sendet.
* Schnittstelle zum Netzwerkprotokoll. Diese Funktion wird automatisch aufgerufen, wenn der
* Benutzer eine eigene Nachricht sendet.
*
* @param message Nachricht, die der Benutzer abgeschickt hat
*/
public void onSendToNetwork(String message) {
@@ -7,15 +7,11 @@ 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.
* <p>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.
* <p>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 {
@@ -9,13 +9,11 @@ import javafx.stage.Stage;
/**
* Hauptklasse für das Casino-Spiel-UI.
*
* Startet die JavaFX-Anwendung, lädt die grafische Oberfläche aus der FXML-Datei
* und initialisiert die Haupt-Stage für das Spiel.
* <p>Startet die JavaFX-Anwendung, lädt die grafische Oberfläche aus der FXML-Datei und
* initialisiert die Haupt-Stage für das Spiel.
*
* Aufgaben:
* - Lädt die FXML-Oberfläche "/ui-structure/Casinogameui.fxml".
* - Lädt das Anwendungs-Icon aus "/images/logoinverted.png".
* - Startet die Anwendung im Vollbildmodus.
* <p>Aufgaben: - Lädt die FXML-Oberfläche "/ui-structure/Casinogameui.fxml". - Lädt das
* Anwendungs-Icon aus "/images/logoinverted.png". - Startet die Anwendung im Vollbildmodus.
*/
public class CasinoGameUI extends Application {
@@ -44,6 +42,7 @@ public class CasinoGameUI extends Application {
/**
* Startpunkt der Anwendung.
*
* @param args Befehlszeilenargumente.
*/
public static void main(String[] args) {
@@ -31,32 +31,22 @@ import javafx.stage.Stage;
/**
* Experimenteller integrierter Browser für Casono.
*
* Diese Klasse implementiert einen einfachen eingebetteten Webbrowser
* auf Basis von {@link javafx.scene.web.WebView}. Der Browser dient
* primär als Hilfswerkzeug innerhalb des Spiels, um externe Inhalte
* wie Webseiten oder Videos anzuzeigen.
* <p>Diese Klasse implementiert einen einfachen eingebetteten Webbrowser auf Basis von {@link
* javafx.scene.web.WebView}. Der Browser dient primär als Hilfswerkzeug innerhalb des Spiels, um
* externe Inhalte wie Webseiten oder Videos anzuzeigen.
*
* Status
* Der Browser befindet sich derzeit in einer experimentellen Phase.
* Einige Sicherheitsmechanismen basieren auf experimentellen
* KI-gestützten Empfehlungen und können sich in zukünftigen
* Versionen noch ändern.
* <p>Status Der Browser befindet sich derzeit in einer experimentellen Phase. Einige
* Sicherheitsmechanismen basieren auf experimentellen KI-gestützten Empfehlungen und können sich in
* zukünftigen Versionen noch ändern.
*
* Zweck
* Der Browser wird aktuell experimentell genutzt, um:
* Pokerregeln direkt im Spiel zu erklären
* Hilfeseiten oder Dokumentationen anzuzeigen
* Videos (z.B. Tutorials oder Erklärungen) über Plattformen wie YouTube abzuspielen
* <p>Zweck Der Browser wird aktuell experimentell genutzt, um: Pokerregeln direkt im Spiel zu
* erklären Hilfeseiten oder Dokumentationen anzuzeigen Videos (z.B. Tutorials oder Erklärungen)
* über Plattformen wie YouTube abzuspielen
*
* Sicherheitsmechanismen
* Da externe Webseiten geladen werden können, wurden einige
* grundlegende Schutzmaßnahmen integriert:
* - HTTPS-Zwang für Webseiten
* - Whitelist für bekannte Domains
* - Warnung bei unbekannten Webseiten
* - JavaScript standardmäßig deaktiviert (man kann es jedoch für Google etc. einschalten)
* - Popup-Blocker
* - Automatische Cookie-Löschung beim Schließen
* <p>Sicherheitsmechanismen Da externe Webseiten geladen werden können, wurden einige grundlegende
* Schutzmaßnahmen integriert: - HTTPS-Zwang für Webseiten - Whitelist für bekannte Domains -
* Warnung bei unbekannten Webseiten - JavaScript standardmäßig deaktiviert (man kann es jedoch für
* Google etc. einschalten) - Popup-Blocker - Automatische Cookie-Löschung beim Schließen
*/
public class CasinoBrowserController {
@@ -105,25 +95,25 @@ public class CasinoBrowserController {
private static boolean javascriptEnabled = false;
/**
* Löscht alle gespeicherten Cookies der aktuellen Browser-Sitzung.
*/
/** Löscht alle gespeicherten Cookies der aktuellen Browser-Sitzung. */
private static void clearCookies() {
try {
COOKIE_MANAGER.getCookieStore().removeAll();
} catch (Exception ignored) {}
} catch (Exception ignored) {
}
}
/**
* Öffnet ein neues Browserfenster und lädt eine angegebene Webseite.
*
* Falls die Webseite nicht zur Liste vertrauenswürdiger Domains gehört,
* wird der Benutzer gefragt, ob die Seite dennoch geladen werden soll.
* <p>Falls die Webseite nicht zur Liste vertrauenswürdiger Domains gehört, wird der Benutzer
* gefragt, ob die Seite dennoch geladen werden soll.
*
* @param url die Startadresse der Webseite, die geladen werden soll
*/
public static void open(String url) {
Platform.runLater(() -> {
Platform.runLater(
() -> {
Stage stage = new Stage();
WebView webView = new WebView();
@@ -142,10 +132,10 @@ public class CasinoBrowserController {
clip.setArcHeight(CORNER_RADIUS);
webView.setClip(clip);
webView.widthProperty().addListener((o, a, b) ->
clip.setWidth(b.doubleValue()));
webView.heightProperty().addListener((o, a, b) ->
clip.setHeight(b.doubleValue()));
webView.widthProperty()
.addListener((o, a, b) -> clip.setWidth(b.doubleValue()));
webView.heightProperty()
.addListener((o, a, b) -> clip.setHeight(b.doubleValue()));
ImageView browserLogo = loadLogos(stage);
@@ -159,9 +149,17 @@ public class CasinoBrowserController {
Button closeBtn = createCloseButton(stage, webView);
configureUrlEvents(engine, urlField, securityLabel);
HBox taskbar = new HBox(HBOX_SPACIN, browserLogo, backBtn, fwdBtn,
reloadBtn, urlField, jsToggle, securityLabel, closeBtn
);
HBox taskbar =
new HBox(
HBOX_SPACIN,
browserLogo,
backBtn,
fwdBtn,
reloadBtn,
urlField,
jsToggle,
securityLabel,
closeBtn);
taskbar.getStyleClass().add("taskbar-browser");
taskbar.setAlignment(Pos.CENTER_LEFT);
@@ -197,7 +195,8 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen
*/
public static void configurePopupBlocker(WebEngine engine) {
engine.setCreatePopupHandler(config -> {
engine.setCreatePopupHandler(
config -> {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setTitle("Popup blockiert");
alert.setHeaderText(null);
@@ -209,7 +208,8 @@ public class CasinoBrowserController {
// Variable 'streamM' abgekürzt, um das 100-Zeichen-Limit (LineLength)
// einzuhalten
var streamM = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH_MAIN);
var streamM =
CasinoBrowserController.class.getResourceAsStream(LOGO_PATH_MAIN);
Image logomain = new Image(streamM);
if (logo != null) {
@@ -300,11 +300,12 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen
* @return Button Umschalten
*/
public static Button createJsToggle(WebEngine engine){
public static Button createJsToggle(WebEngine engine) {
Button jsToggle = new Button("JS EINSCHALTEN");
jsToggle.getStyleClass().add("red-button");
jsToggle.setOnAction(e -> {
jsToggle.setOnAction(
e -> {
javascriptEnabled = !javascriptEnabled;
engine.setJavaScriptEnabled(javascriptEnabled);
@@ -332,7 +333,8 @@ public class CasinoBrowserController {
public static Button createBackButton(WebEngine engine) {
Button backBtn = new Button("<");
backBtn.getStyleClass().add("gray-button");
backBtn.setOnAction(e -> {
backBtn.setOnAction(
e -> {
if (engine.getHistory().getCurrentIndex() > 0) {
engine.getHistory().go(-1);
}
@@ -350,9 +352,10 @@ public class CasinoBrowserController {
public static Button createForwardButton(WebEngine engine) {
Button fwdBtn = new Button(">");
fwdBtn.getStyleClass().add("gray-button");
fwdBtn.setOnAction(e -> {
if (engine.getHistory().getCurrentIndex() <
engine.getHistory().getEntries().size() - 1) {
fwdBtn.setOnAction(
e -> {
if (engine.getHistory().getCurrentIndex()
< engine.getHistory().getEntries().size() - 1) {
engine.getHistory().go(1);
}
});
@@ -383,11 +386,11 @@ public class CasinoBrowserController {
public static Button createCloseButton(Stage stage, WebView webView) {
Button closeBtn = new Button("X");
closeBtn.getStyleClass().add("red-button");
closeBtn.setOnAction(e -> {
closeBtn.setOnAction(
e -> {
webView.getEngine().load("about:blank");
clearCookies();
stage.close();
});
return closeBtn;
@@ -400,13 +403,10 @@ public class CasinoBrowserController {
* @param urlField URL Textfeld
* @param securityLabel Sicherheits Label
*/
public static void configureUrlEvents(WebEngine engine,
TextField urlField,
Label securityLabel) {
urlField.setOnAction(e ->
loadUrlSafely(engine, urlField.getText(), securityLabel));
engine.locationProperty().addListener((obs, o, n) ->
urlField.setText(n));
public static void configureUrlEvents(
WebEngine engine, TextField urlField, Label securityLabel) {
urlField.setOnAction(e -> loadUrlSafely(engine, urlField.getText(), securityLabel));
engine.locationProperty().addListener((obs, o, n) -> urlField.setText(n));
}
/**
@@ -423,8 +423,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());
@@ -440,7 +439,8 @@ public class CasinoBrowserController {
* @param engine WebEngine nutzen
*/
public static void configureKeyEvents(Scene scene, WebEngine engine) {
scene.setOnKeyPressed(event -> {
scene.setOnKeyPressed(
event -> {
if (event.getCode() == KeyCode.F5) {
engine.reload();
}
@@ -448,17 +448,14 @@ public class CasinoBrowserController {
}
/**
* Lädt eine URL in den Browser, nachdem grundlegende Sicherheitsprüfungen
* durchgeführt wurden.
* Lädt eine URL in den Browser, nachdem grundlegende Sicherheitsprüfungen durchgeführt wurden.
*
* Vor dem Laden einer Seite werden folgende Prüfungen durchgeführt:
* - Überprüfung des Protokolls (nur HTTPS erlaubt)
* - Überprüfung der Domain gegen eine Whitelist
* - Schutz vor Domain-Spoofing (Domain-Vortäuschung)
* <p>Vor dem Laden einer Seite werden folgende Prüfungen durchgeführt: - Überprüfung des
* Protokolls (nur HTTPS erlaubt) - Überprüfung der Domain gegen eine Whitelist - Schutz vor
* Domain-Spoofing (Domain-Vortäuschung)
*
* Falls eine Domain nicht als vertrauenswürdig eingestuft wird,
* muss der Benutzer bestätigen, dass die Seite dennoch geöffnet
* werden darf.
* <p>Falls eine Domain nicht als vertrauenswürdig eingestuft wird, muss der Benutzer
* bestätigen, dass die Seite dennoch geöffnet werden darf.
*
* @param engine der WebEngine-Renderer des Browsers
* @param url die zu ladende Webadresse
@@ -485,8 +482,9 @@ public class CasinoBrowserController {
}
// Sicherer Domain Check
boolean trusted = TRUSTED_DOMAINS.stream().anyMatch(domain ->
host.equals(domain) || host.endsWith("." + domain));
boolean trusted =
TRUSTED_DOMAINS.stream()
.anyMatch(domain -> host.equals(domain) || host.endsWith("." + domain));
if (!trusted) {
if (!showUnknownWebsiteAlert(host)) {
@@ -515,9 +513,9 @@ public class CasinoBrowserController {
alert.setTitle("Unbekannte Website");
alert.setHeaderText("Diese Website ist nicht bekannt");
alert.setContentText(
host + "\n\nDiese Seite ist nicht vom " +
"Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?"
);
host
+ "\n\nDiese Seite ist nicht vom "
+ "Casono Browser verifiziert.\nMöchten Sie sie trotzdem öffnen?");
var stream = CasinoBrowserController.class.getResourceAsStream(LOGO_PATH);
Image logo = new Image(stream);
@@ -11,10 +11,8 @@ 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 Spieleinsätzen,
* - Steuerung allgemeiner Menüfunktionen wie Exit.
* <p>Verantwortlich für: - Drag-and-Drop-Verschieben der Taskleiste, - Eingabe und Verwaltung von
* Spieleinsätzen, - Steuerung allgemeiner Menüfunktionen wie Exit.
*/
public class TaskbarController {
@@ -32,8 +30,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 Position, um später korrekt zu verschieben.
* 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
*/
@@ -44,11 +42,11 @@ public class TaskbarController {
}
/**
* Wird aufgerufen, während die Taskleiste mit der Maus gezogen wird.
* Aktualisiert die Position und skaliert die Taskleiste leicht zur visuellen Rückmeldung.
* 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 kann.
* <p>TODO: Es muss noch gefixt werden, dass die Taskleiste nicht aus dem Fenster verschwinden
* kann.
*
* @param event Das Mausereignis
*/
@@ -62,8 +60,8 @@ public class TaskbarController {
}
/**
* Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird.
* Setzt die Skalierung der Taskleiste wieder auf Normalgröße.
* Wird aufgerufen, wenn die Maus über der Taskleiste losgelassen wird. Setzt die Skalierung der
* Taskleiste wieder auf Normalgröße.
*
* @param event Das Mausereignis
*/
@@ -86,8 +84,8 @@ public class TaskbarController {
}
/**
* Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird.
* Löst die Verarbeitung des Einsatzes aus.
* Wird aufgerufen, wenn der Submit-Button in der Taskleiste gedrückt wird. Löst die
* Verarbeitung des Einsatzes aus.
*/
@FXML
private void onInputSubmittedAction() {
@@ -97,8 +95,8 @@ 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 schließen (kein System.exit/Platform.exit).
* <p>TODO: Logik implementieren, um zur Lobby zurückzukehren, ohne die gesamte Anwendung zu
* schließen (kein System.exit/Platform.exit).
*/
@FXML
private void onExitButtonClick() {
@@ -106,10 +104,9 @@ public class TaskbarController {
}
/**
* 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.
* 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() {
String input = taskbarInput.getText();
@@ -131,8 +128,8 @@ public class TaskbarController {
/**
* Öffnet den integrierten Casono Webbrowser.
*
* TODO: Ersetze die Start-URL durch die offizielle Projekt-Website (z.B. Tipps & Tricks Seite),
* sobald die Inhalte für Strategien und Support bereitstehen.
* <p>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
private void onBrowserButtonClick() {
@@ -1,41 +1,43 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
/**
* Main UI application for Casono.
* Loads the main FXML layout and sets up the stage.
*/
/** Main UI application for Casono. Loads the main FXML layout and sets up the stage. */
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
/**
* JavaFX Application class for the Casono main UI.
* <p>
* Standardkonstruktor für die Anwendung.
*
* <p>Standardkonstruktor für die Anwendung.
*/
public class Casinomainui extends Application {
/**
* Standardkonstruktor.
*/
/** Standardkonstruktor. */
public Casinomainui() {
// Standardkonstruktor
}
private static final int SCENE_WIDTH = 1200;
private static final int SCENE_HEIGHT = 800;
@Override
/**
* Starts the JavaFX application and loads the main UI.
*
* @param stage The primary stage for this application.
* @throws IOException If loading the FXML fails.
*/
public void start(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("/ui-structure/Casinomainui.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 1200, 800);
FXMLLoader fxmlLoader =
new FXMLLoader(getClass().getResource("/ui-structure/Casinomainui.fxml"));
Scene scene = new Scene(fxmlLoader.load(), SCENE_WIDTH, SCENE_HEIGHT);
stage.setTitle("Casono");
stage.getIcons().add(new javafx.scene.image.Image(getClass().getResource("/images/logoinverted.png").toExternalForm()));
javafx.scene.image.Image icon =
new javafx.scene.image.Image(
getClass().getResource("/images/logoinverted.png").toExternalForm());
stage.getIcons().add(icon);
stage.setScene(scene);
stage.setFullScreen(true);
stage.show();
@@ -43,6 +45,7 @@ public class Casinomainui extends Application {
/**
* Main entry point for launching the application.
*
* @param args Command line arguments
*/
public static void main(String[] args) {
@@ -2,34 +2,27 @@ package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import javafx.application.Platform;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.VBox;
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 +32,7 @@ public class CasinomainuiController {
// Default constructor
}
/**
* Initializes the UI components and sets default values.
*/
/** Initializes the UI components and sets default values. */
@FXML
public void initialize() {
titleLabel.setText("Casono");
@@ -49,37 +40,34 @@ public class CasinomainuiController {
logoView.setImage(new Image(getClass().getResource("/images/logo.png").toExternalForm()));
translationManager = new LobbyButtonTranslationManager();
gridManager = new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager);
gridManager =
new LobbyButtonGridManager(new javafx.scene.layout.GridPane(), translationManager);
casinoTable.getChildren().clear();
casinoTable.getChildren().add(gridManager.getGridPane());
gridManager.renderLobbyButtons();
}
/**
* Handles the exit button action to close the application.
*/
/** Handles the exit button action to close the application. */
@FXML
public void handleexitbutton() {
Platform.exit();
}
/**
* Handles creation of a new lobby button.
*/
/** Handles creation of a new lobby button. */
@FXML
public void handleCreateLobbyButton() {
if (translationManager.isFull()) {
System.out.println("Grid voll! Keine weiteren Lobbys moeglich.");
LOGGER.warn("Grid voll! Keine weiteren Lobbys moeglich.");
return;
}
int buttonId = nextButtonId++;
int lobbyId = gridManager.createLobby();
try {
translationManager.addLobbyButton(buttonId, lobbyId);
System.out.println("ButtonID: " + buttonId + ", LobbyID: " + lobbyId);
LOGGER.info("ButtonID: {}, LobbyID: {}", buttonId, lobbyId);
gridManager.renderLobbyButtons();
} catch (Exception e) {
System.out.println("Fehler beim Hinzufügen: " + e.getMessage());
LOGGER.error("Fehler beim Hinzufügen: {}", e.getMessage());
}
}
}
@@ -1,32 +1,41 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
/**
* Manages the grid for lobby buttons and rendering.
* Uses LobbyButtonTranslationManager for mapping ButtonID to LobbyID.
* Manages the grid for lobby buttons and rendering. Uses LobbyButtonTranslationManager for mapping
* ButtonID to LobbyID.
*/
import java.util.Map;
import javafx.scene.control.Button;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import java.util.Map;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
/**
* Manages the grid for lobby buttons and rendering.
* Uses LobbyButtonTranslationManager for mapping ButtonID to LobbyID.
* Manages the grid for lobby buttons and rendering. Uses LobbyButtonTranslationManager for mapping
* ButtonID to LobbyID.
*/
public class LobbyButtonGridManager {
private static final Logger LOGGER = LogManager.getLogger(LobbyButtonGridManager.class);
/** GridPane for the button grid. */
private final GridPane gridPane;
/** Manager for mapping ButtonID to LobbyID. */
private final LobbyButtonTranslationManager translationManager;
/** Number of rows in the grid. */
private final int rows = 2;
private static final int ROWS = 2;
/** Number of columns in the grid. */
private final int cols = 4;
private static final int COLS = 4;
/** Path to the button image. */
private final String buttonImagePath = "/images/logo.png";
private static final String BUTTON_IMAGE_PATH = "/images/logo.png";
/** Max random lobby id. */
private static final int MAX_RANDOM_LOBBY_ID = 10000;
/**
* Constructor for the GridManager.
@@ -34,14 +43,15 @@ public class LobbyButtonGridManager {
* @param gridPane the GridPane for rendering
* @param translationManager the manager for mapping ButtonID to LobbyID
*/
public LobbyButtonGridManager(GridPane gridPane, LobbyButtonTranslationManager translationManager) {
public LobbyButtonGridManager(
GridPane gridPane, LobbyButtonTranslationManager translationManager) {
this.gridPane = gridPane;
this.translationManager = translationManager;
}
/**
* Renders all lobby buttons in the grid.
* Creates a button for each mapping with image and event handler.
* Renders all lobby buttons in the grid. Creates a button for each mapping with image and event
* handler.
*/
public void renderLobbyButtons() {
gridPane.getChildren().clear();
@@ -55,14 +65,17 @@ public class LobbyButtonGridManager {
int buttonId = entry.getKey();
Button btn = new Button();
btn.setId("lobbyBtn-" + buttonId);
btn.setGraphic(new ImageView(new Image(getClass().getResourceAsStream(buttonImagePath))));
btn.setOnAction(e -> {
btn.setGraphic(
new ImageView(new Image(getClass().getResourceAsStream(BUTTON_IMAGE_PATH))));
btn.setOnAction(
e -> {
Integer lobbyId = translationManager.getLobbyIdForButton(buttonId);
if (lobbyId != null)
if (lobbyId != null) {
joinLobby(lobbyId);
}
});
int row = index / cols;
int col = index % cols;
int row = index / COLS;
int col = index % COLS;
gridPane.add(btn, col, row);
index++;
}
@@ -75,8 +88,8 @@ public class LobbyButtonGridManager {
*/
public int createLobby() {
// TODO: Replace with actual lobby creation logic
int lobbyId = (int) (Math.random() * 10000 + 1);
System.out.println("Lobby created: " + lobbyId);
int lobbyId = (int) (Math.random() * MAX_RANDOM_LOBBY_ID + 1);
LOGGER.info("Lobby created: {}", lobbyId);
return lobbyId;
}
@@ -87,7 +100,7 @@ public class LobbyButtonGridManager {
*/
public void joinLobby(int lobbyId) {
// TODO: Replace with actual join logic
System.out.println("Joining lobby: " + lobbyId);
LOGGER.info("Joining lobby: {}", lobbyId);
}
/**
@@ -4,24 +4,24 @@ import java.util.HashMap;
import java.util.Map;
/**
* Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher.
* Keine Dateioperationen, nur Laufzeitdatenstruktur.
* Verwaltet das Mapping zwischen Button-IDs und Lobby-IDs rein im Speicher. Keine Dateioperationen,
* nur Laufzeitdatenstruktur.
*/
public class LobbyButtonTranslationManager {
/** Maximale Anzahl an Buttons/Lobbys */
private static final int MAX_BUTTONS = 8;
/** Zuordnung ButtonID → LobbyID */
private final Map<Integer, Integer> buttonIdToLobbyId = new HashMap<>();
/**
* Konstruktor: initialisiert die Zuordnung leer.
*/
/** Konstruktor: initialisiert die Zuordnung leer. */
public LobbyButtonTranslationManager() {
// Zuordnung bleibt leer beim Start
}
/**
* Prüft, ob das Grid voll ist (MAX_BUTTONS erreicht).
*
* @return true, wenn Grid voll; sonst false
*/
public boolean isFull() {
@@ -30,17 +30,21 @@ public class LobbyButtonTranslationManager {
/**
* Fügt eine Zuordnung ButtonID → LobbyID hinzu.
*
* @param buttonId Die ID des Buttons
* @param lobbyId Die ID der Lobby
* @throws Exception wenn das Grid voll ist
*/
public void addLobbyButton(int buttonId, int lobbyId) throws Exception {
if (isFull()) throw new Exception("Grid is full!");
if (isFull()) {
throw new Exception("Grid is full!");
}
buttonIdToLobbyId.put(buttonId, lobbyId);
}
/**
* Entfernt eine Zuordnung für die gegebene ButtonID.
*
* @param buttonId Die ID des zu entfernenden Buttons
*/
public void removeLobbyButton(int buttonId) {
@@ -49,6 +53,7 @@ public class LobbyButtonTranslationManager {
/**
* Gibt die LobbyID für eine gegebene ButtonID zurück.
*
* @param buttonId Die ButtonID
* @return Die zugehoerige LobbyID oder null, falls nicht vorhanden
*/
@@ -58,6 +63,7 @@ public class LobbyButtonTranslationManager {
/**
* Gibt die gesamte Zuordnung ButtonID → LobbyID zurück.
*
* @return Map aller Zuordnungen
*/
public Map<Integer, Integer> getButtonIdToLobbyId() {
@@ -1,8 +1,8 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import javafx.scene.layout.GridPane;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class LobbyButtonGridManagerTest {
@@ -1,8 +1,8 @@
package ch.unibas.dmi.dbis.cs108.casono.client.ui.lobbyui;
import org.junit.jupiter.api.*;
import java.util.Map;
import org.junit.jupiter.api.*;
import static org.junit.jupiter.api.Assertions.*;
class LobbyButtonTranslationManagerTest {