From 815caff372e085e1f423f6a00f47c30261ace99f Mon Sep 17 00:00:00 2001 From: jk Date: Sat, 14 Mar 2026 11:34:50 +0100 Subject: [PATCH] add: chat controller --- .../gameuicomponents/ChatController.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/ChatController.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/ChatController.java new file mode 100644 index 0000000..b32f898 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/casono/client/ui/gameui/gameuicomponents/ChatController.java @@ -0,0 +1,89 @@ +package ch.unibas.dmi.dbis.cs108.casono.client.ui.gameui.gameuicomponents; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.TextField; +import javafx.scene.layout.VBox; +import javafx.scene.control.Label; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; +import javafx.scene.control.ScrollPane; + +/** + * 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) + * + * 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 + */ +public class ChatController { + + @FXML + private VBox chatVBox; + + @FXML + private TextField inputField; + + @FXML + private Button sendButton; + + @FXML + private ScrollPane chatScrollPane; + + /** + * 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. + */ + @FXML + private void sendMessage() { + String message = inputField.getText().trim(); + if (!message.isEmpty()) { + inputField.clear(); + + // Hier wird die eigene Nachricht ans Netzwerkprotokoll übergeben + onSendToNetwork(message); + } + } + + /** + * 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 + */ + public void receiveMessage(String player, String message) { + String time = LocalTime.now().format(DateTimeFormatter.ofPattern("HH:mm")); + Label label = new Label("[" + time + "] " + player + ": " + message); + label.getStyleClass().add("info-text"); + label.setWrapText(true); // Zeilenumbruch aktivieren + label.maxWidthProperty().bind(chatVBox.widthProperty().subtract(20)); + chatVBox.getChildren().add(label); + } + + /** + * 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) { + // TODO: Netzwerkcode einfügen + receiveMessage("Du", message); + } +} \ No newline at end of file