add: chat controller

This commit is contained in:
jk
2026-03-14 11:34:50 +01:00
parent c441318df9
commit 815caff372
@@ -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);
}
}