From 0270202c3f832f51987a4364546dfd63454027a3 Mon Sep 17 00:00:00 2001 From: Sebastian Lenzlinger Date: Sat, 16 Apr 2022 16:05:21 +0200 Subject: [PATCH] Extending functionality to connect the incoming msgs to the gui via buffered readers. --- .../dbis/cs108/multiplayer/client/Client.java | 7 +++ .../client/JClientProtocolParser.java | 3 +- .../multiplayer/client/gui/ClientModel.java | 2 + .../multiplayer/client/gui/chat/ChatApp.java | 20 ++++++++ .../client/gui/chat/ChatController.java | 50 ++++++++++++++++--- .../client/gui/chat/ChatIncomingThread.java | 31 ++++++++++++ .../client/gui/chat/outChatCmd.java | 41 --------------- 7 files changed, 105 insertions(+), 49 deletions(-) create mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatIncomingThread.java delete mode 100644 src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/outChatCmd.java diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java index 97e661e..01352e7 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/Client.java @@ -1,6 +1,7 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat.ChatApp; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.ClientPinger; @@ -26,6 +27,9 @@ public class Client { private BufferedWriter out; public ClientPinger clientPinger; + private BufferedWriter toChatGui; + private ChatApp chatApp; + /** * Saves the position of the client, gets refreshed everytime the client gets a vote request. */ @@ -242,4 +246,7 @@ public class Client { public BufferedWriter getOut() { return out; } + + public void sendToChat(String substring) { + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java index 35d60e3..d932eda 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/JClientProtocolParser.java @@ -2,6 +2,7 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client; import ch.unibas.dmi.dbis.cs108.BudaLogConfig; import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; +import java.io.OutputStreamWriter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -41,7 +42,7 @@ public class JClientProtocolParser { break; case Protocol.printToClientChat: //todo: handle chat separately from console. - System.out.println(msg.substring(6)); + c.sendToChat(msg.substring(6)); break; case Protocol.serverConfirmQuit: c.disconnectFromServer(); diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java index 4ce0f5d..0e5d38b 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/ClientModel.java @@ -6,6 +6,8 @@ public class ClientModel { private String username; private Client client; + private String incomingChatMsg; + //private Number; public Client getClient() { diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatApp.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatApp.java index 422f16e..1bb4b85 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatApp.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatApp.java @@ -1,9 +1,19 @@ package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; +import ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.ClientModel; import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.layout.AnchorPane; import javafx.stage.Stage; public class ChatApp extends Application { + ClientModel clientModel; + ChatController chatController; + + public ChatApp(ClientModel clientModel) { + this.clientModel = clientModel; + this.chatController = new ChatController(clientModel); + } /** * The main entry point for all JavaFX applications. The start method is called after the init @@ -21,5 +31,15 @@ public class ChatApp extends Application { @Override public void start(Stage primaryStage) throws Exception { + ChatApp chatApp = new ChatApp(new ClientModel()); + AnchorPane root = new AnchorPane(chatController.getChatPaneRoot()); + // TODO bin chatController.getChatPaneRoot() border to root border for rezising + Scene scene = new Scene(root); + primaryStage.setResizable(true); + primaryStage.setTitle("Chat"); + primaryStage.setScene(scene); + primaryStage.show(); + + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java index 66883f8..bef4905 100644 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatController.java @@ -10,10 +10,13 @@ import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; +import javafx.collections.ListChangeListener; import javafx.event.ActionEvent; import javafx.event.EventHandler; +import javafx.event.EventType; import javafx.fxml.FXML; import javafx.fxml.Initializable; +import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.ColorPicker; import javafx.scene.control.Label; @@ -41,18 +44,17 @@ public class ChatController implements Initializable { private ClientModel client; private SimpleBooleanProperty whisperTargetChosen; - private SimpleStringProperty cmd; + private String cmd; private static final String whisper = Protocol.whisper; private static final String chatToAll = Protocol.chatMsgToAll; private static final String chatToLobby = Protocol.chatMsgToLobby; - public ChatController(ClientModel client) { this.client = client; whisperTargetChosen = new SimpleBooleanProperty(); - cmd = new SimpleStringProperty(); + cmd = ""; } @@ -68,6 +70,12 @@ public class ChatController implements Initializable { public void initialize(URL location, ResourceBundle resources) { + vBoxChatMessages.getChildren().addListener(new ListChangeListener() { + @Override + public void onChanged(Change c) { + vBoxChatMessages.setMaxHeight(vBoxChatMessages.getMaxHeight()*2); + } + }); vBoxChatMessages.heightProperty().addListener(new ChangeListener() { /** @@ -84,11 +92,11 @@ public class ChatController implements Initializable { } }); + + /** + * Initialize what heppens when the sen button is pressed + */ sendButton.setOnAction(new EventHandler() { - /** - * control what to do when the "SendButton" is pressed - * @param event - */ @Override public void handle(ActionEvent event) { String msg = chatMsgField.getText(); @@ -101,6 +109,10 @@ public class ChatController implements Initializable { } } }); + + /** + * Initialize the change of the TextArea field holding potential chat messages + */ chatMsgField.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, @@ -109,8 +121,25 @@ public class ChatController implements Initializable { } }); + //Bind the the fact if the whisper field contains a name to a boolean whisperTargetChosen.bind(whisperTargetSelectField.textProperty().isEmpty()); + /** + * change the chat command based on the whisper text field. + */ + whisperTargetChosen.addListener(new ChangeListener() { + @Override + public void changed(ObservableValue observable, Boolean oldValue, + Boolean newValue) { + //is true if {@code whisperTargetSelectedField} has content + if(!newValue) { + cmd = whisper + "$"; + } else { + cmd = chatToLobby + "$"; + } + } + }); + whisperTargetSelectField.textProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue observable, String oldValue, @@ -137,4 +166,11 @@ public class ChatController implements Initializable { public SplitPane getChatPaneRoot() { return chatPaneRoot; } + + public void addChatMsgToView(String msg) { + Label l = new Label(msg); + l.setBackground(Background.fill(Color.LIGHTSKYBLUE)); + l.setTextFill(Color.BLACK); + vBoxChatMessages.getChildren().add(l); + } } diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatIncomingThread.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatIncomingThread.java new file mode 100644 index 0000000..c927748 --- /dev/null +++ b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/ChatIncomingThread.java @@ -0,0 +1,31 @@ +package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; + +import java.io.BufferedReader; +import java.io.BufferedWriter; + +/** + * To get the chat messages to the chat window. + */ +public class ChatIncomingThread implements Runnable { + + BufferedReader inputReader; + ChatApp chatApp; + public ChatIncomingThread(BufferedReader inputReader, ChatApp chatApp) { + this.inputReader = inputReader; + this.chatApp = chatApp; + } + + /** + * When an object implementing interface {@code Runnable} is used to create a thread, starting the + * thread causes the object's {@code run} method to be called in that separately executing + * thread. + *

+ * The general contract of the method {@code run} is that it may take any action whatsoever. + * + * @see Thread#run() + */ + @Override + public void run() { + + } +} diff --git a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/outChatCmd.java b/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/outChatCmd.java deleted file mode 100644 index 5ac79ad..0000000 --- a/src/main/java/ch/unibas/dmi/dbis/cs108/multiplayer/client/gui/chat/outChatCmd.java +++ /dev/null @@ -1,41 +0,0 @@ -package ch.unibas.dmi.dbis.cs108.multiplayer.client.gui.chat; - -import ch.unibas.dmi.dbis.cs108.multiplayer.helpers.Protocol; -import javafx.beans.value.ChangeListener; -import javafx.beans.value.ObservableValue; - -public class outChatCmd implements ChangeListener { - - private String cmd; - private static final Protocol prtcl = new Protocol(); - private static final String whisper = Protocol.whisper; - private static final String chatToAll = Protocol.chatMsgToAll; - private static final String chatToLobby = Protocol.chatMsgToLobby - - public outChatCmd(String cmd, String parameters) { - this.cmd = cmd; - this.parameters = parameters; - } - - public String getCmd() { - return cmd; - } - - public String getParameters() { - return parameters; - } - - /** - * Called when the value of an {@link ObservableValue} changes. - *

- * In general, it is considered bad practice to modify the observed value in this method. - * - * @param observable The {@code ObservableValue} which value changed - * @param oldValue The old value - * @param newValue - */ - @Override - public void changed(ObservableValue observable, Object oldValue, Object newValue) { - - } -}