From 4a5e37663d7ae5e842040beeb7d9d42581c1d42a Mon Sep 17 00:00:00 2001 From: Erika Falk Svensen Date: Wed, 12 Nov 2025 14:01:42 +0100 Subject: [PATCH 1/2] =?UTF-8?q?F=C3=B6rsta=20commit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/HelloController.java | 61 +++++++++++++--- src/main/java/com/example/HelloModel.java | 72 ++++++++++++++++--- .../resources/com/example/hello-view.fxml | 37 +++++++--- 3 files changed, 141 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/example/HelloController.java b/src/main/java/com/example/HelloController.java index fdd160a0..9757cbf1 100644 --- a/src/main/java/com/example/HelloController.java +++ b/src/main/java/com/example/HelloController.java @@ -1,22 +1,63 @@ package com.example; import javafx.fxml.FXML; -import javafx.scene.control.Label; +import javafx.scene.control.Button; +import javafx.scene.control.ListView; +import javafx.scene.control.TextField; +import javafx.application.Platform; -/** - * Controller layer: mediates between the view (FXML) and the model. - */ public class HelloController { + // Kopplas till FXML-filen + @FXML private TextField inputField; + @FXML private Button sendBtn; + @FXML private ListView messages; + + // Skapar modellen som sköter nätverksdelen (skicka/ta emot) private final HelloModel model = new HelloModel(); + // Körs automatiskt när appen startar @FXML - private Label messageLabel; + public void initialize() { + // Starttext när programmet öppnas + messages.getItems().add("Ansluten till: " + model.info()); + messages.getItems().add("Skriv ett meddelande och tryck Skicka!"); - @FXML - private void initialize() { - if (messageLabel != null) { - messageLabel.setText(model.getGreeting()); + // Börja lyssna efter inkommande meddelanden + startListeningToMessages(); + + // När man trycker på Skicka-knappen + sendBtn.setOnAction(_ -> sendMessage()); + } + + // Skickar ett meddelande till chatten + private void sendMessage() { + String text = inputField.getText(); + + if (text == null || text.isBlank()) { + return; // Skicka inte tomt meddelande } + + // Visa direkt i listan + messages.getItems().add("Jag: " + text); + + // Skicka till servern + model.sendMessage(text); + + // Töm textfältet + inputField.clear(); + } + + // Lyssnar efter nya meddelanden i bakgrunden + private void startListeningToMessages() { + model.startListening( + // När ett nytt meddelande kommer + msg -> Platform.runLater(() ->messages.getItems().add("Inkommande: " + msg) + ), + + //Om ett fel inträffar + err -> Platform.runLater(() ->messages.getItems().add("Fel: " + err.getMessage()) + ) + ); } -} +} \ 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..f949855b 100644 --- a/src/main/java/com/example/HelloModel.java +++ b/src/main/java/com/example/HelloModel.java @@ -1,15 +1,65 @@ package com.example; -/** - * Model layer: encapsulates application data and business logic. - */ +import java.net.HttpURLConnection; +import java.net.URL; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.function.Consumer; + 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 String baseUrl = "https://ntfy.sh"; + private final String topic = "java25-erika-chat"; + + // Skickar ett textmeddelande till ntfy + public void sendMessage(String message) { + try { + var url = new URL(baseUrl + "/" + topic); + var conn = (HttpURLConnection) url.openConnection(); + + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + + conn.getOutputStream().write(message.getBytes()); + + System.out.println("Skickat till " + url + ": " + message); + conn.disconnect(); + } catch (Exception e) { + System.out.println("Något gick fel: " + e.getMessage()); + } + } + + // Startar en tråd som lyssnar efter nya meddelanden + public void startListening(Consumer onMessage, Consumer onError) { + new Thread(() -> { + try { + var url = new URL(baseUrl + "/" + topic + "/json"); + var conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + + var reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String line; + + while ((line = reader.readLine()) != null) { + // Plocka ut texten mellan "message":" och nästa " + int start = line.indexOf("\"message\":\""); + if (start != -1) { + start += 11; + int end = line.indexOf("\"", start); + if (end != -1) { + String msg = line.substring(start, end); + if (onMessage != null) onMessage.accept(msg); + } + } + } + + } catch (Throwable ex) { + if (onError != null) onError.accept(ex); + } + }).start(); + } + + // Visar vilken topic och url som används + public String info() { + return baseUrl + "/" + topic; } -} +} \ 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..aa075344 100644 --- a/src/main/resources/com/example/hello-view.fxml +++ b/src/main/resources/com/example/hello-view.fxml @@ -1,9 +1,30 @@ - - - - - - - + + + + + + + + + + +
+ +
+ + + + + +