From eac6bfa0a94cd3045e61a3e69fc63143a787789d Mon Sep 17 00:00:00 2001 From: Dino Date: Wed, 12 Nov 2025 15:24:57 +0100 Subject: [PATCH] =?UTF-8?q?F=C3=A4rdig=20JavaFX=20chat=20app=20med=20teste?= =?UTF-8?q?r?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mvnw | 0 .../java/com/example/HelloController.java | 23 +++++--- src/main/java/com/example/HelloFX.java | 10 +--- src/main/java/com/example/HelloModel.java | 57 +++++++++++++++---- src/main/java/module-info.java | 3 +- .../resources/com/example/hello-view.fxml | 31 +++++++--- src/test/java/com/example/HelloModelTest.java | 38 +++++++++++++ 7 files changed, 128 insertions(+), 34 deletions(-) mode change 100644 => 100755 mvnw create mode 100644 src/test/java/com/example/HelloModelTest.java diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/src/main/java/com/example/HelloController.java b/src/main/java/com/example/HelloController.java index fdd160a0..4175ee1c 100644 --- a/src/main/java/com/example/HelloController.java +++ b/src/main/java/com/example/HelloController.java @@ -1,22 +1,27 @@ package com.example; import javafx.fxml.FXML; -import javafx.scene.control.Label; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; -/** - * Controller layer: mediates between the view (FXML) and the model. - */ public class HelloController { + @FXML private TextArea chatArea; + @FXML private TextField inputField; - private final HelloModel model = new HelloModel(); + private HelloModel model; @FXML - private Label messageLabel; + public void initialize() { + model = new HelloModel("javafx-chat"); // Du kan byta topic-namnet + model.listen(msg -> chatArea.appendText(msg + "\n")); + } @FXML - private void initialize() { - if (messageLabel != null) { - messageLabel.setText(model.getGreeting()); + public void onSendButtonClick() { + String text = inputField.getText().trim(); + if (!text.isEmpty()) { + model.sendMessage(text); + inputField.clear(); } } } diff --git a/src/main/java/com/example/HelloFX.java b/src/main/java/com/example/HelloFX.java index 96bdc5ca..ddbb063e 100644 --- a/src/main/java/com/example/HelloFX.java +++ b/src/main/java/com/example/HelloFX.java @@ -2,18 +2,15 @@ import javafx.application.Application; import javafx.fxml.FXMLLoader; -import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; public class HelloFX extends Application { - @Override public void start(Stage stage) throws Exception { FXMLLoader fxmlLoader = new FXMLLoader(HelloFX.class.getResource("hello-view.fxml")); - Parent root = fxmlLoader.load(); - Scene scene = new Scene(root, 640, 480); - stage.setTitle("Hello MVC"); + Scene scene = new Scene(fxmlLoader.load()); + stage.setTitle("JavaFX Chat App đź’¬"); stage.setScene(scene); stage.show(); } @@ -21,5 +18,4 @@ public void start(Stage stage) throws Exception { public static void main(String[] args) { launch(); } - -} \ No newline at end of file +} diff --git a/src/main/java/com/example/HelloModel.java b/src/main/java/com/example/HelloModel.java index 385cfd10..ce65094b 100644 --- a/src/main/java/com/example/HelloModel.java +++ b/src/main/java/com/example/HelloModel.java @@ -1,15 +1,52 @@ package com.example; -/** - * Model layer: encapsulates application data and business logic. - */ +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.concurrent.CompletableFuture; + public class HelloModel { - /** - * Returns a greeting based on the current Java and JavaFX versions. - */ - public String getGreeting() { - String javaVersion = System.getProperty("java.version"); - String javafxVersion = System.getProperty("javafx.version"); - return "Hello, JavaFX " + javafxVersion + ", running on Java " + javaVersion + "."; + private final HttpClient client = HttpClient.newHttpClient(); + private final String topic; + private final String backendUrl; + + public HelloModel(String topic) { + this.topic = topic; + this.backendUrl = System.getenv("BACKEND_URL"); + if (backendUrl == null) { + throw new IllegalStateException("BACKEND_URL is not set!"); + } + } + + public void sendMessage(String message) { + String json = "{\"message\": \"" + message + "\"}"; + String url = backendUrl + "/" + topic; + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .header("Content-Type", "application/json") + .POST(HttpRequest.BodyPublishers.ofString(json)) + .build(); + + client.sendAsync(request, HttpResponse.BodyHandlers.ofString()); + } + + public CompletableFuture listen(MessageHandler handler) { + String url = backendUrl + "/" + topic + "/json"; + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(url)) + .build(); + + return client.sendAsync(request, HttpResponse.BodyHandlers.ofLines()) + .thenAccept(response -> response.body().forEach(line -> { + if (line.contains("\"message\"")) { + handler.onMessage(line); + } + })); + } + + public interface MessageHandler { + void onMessage(String message); } } diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 71574a27..30860c03 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -1,7 +1,8 @@ module hellofx { requires javafx.controls; requires javafx.fxml; + requires java.net.http; opens com.example to javafx.fxml; exports com.example; -} \ No newline at end of file +} diff --git a/src/main/resources/com/example/hello-view.fxml b/src/main/resources/com/example/hello-view.fxml index 20a7dc82..08fd4c23 100644 --- a/src/main/resources/com/example/hello-view.fxml +++ b/src/main/resources/com/example/hello-view.fxml @@ -1,9 +1,26 @@ - - + + + - - - - + + +
+