JavaFX -> SocketIO -> Thread -> Update Label

JNodex

Mitglied
Heyho,

ich bin neu hier und ich hoffe Ihr könnt mir etwas helfen.
Da ich bisher kaum in Java programmiert habe komm ich an einem bestimmten Punkt nicht mehr weiter.
Ich habe einen Node.js server + Java Desktop Applikation. Ich kann zum Node.js server connecten + eine msg empfangen.
Diese printe ich momentan aus. Soweit passt das alles.
Aber nun zu meinem Problem ^^ wahrscheinlich Simpel aber ich check es nicht. Ich möchte den String den ich momentan habe nicht printen sondern in ein Label setzen.

Mein Socket wird über eine sperate Klasse SocketHandler gesteuert und in der Main Klasse durch Initialisierung ausgeführt:
Java:
//Handle thread
    private void sockThread (){
        mSocket.on("SocketID", new Emitter.Listener() {
             public void call(final Object... args) {
                Platform.runLater(new Runnable() {
                    public void run() {
                        JSONObject obj = (JSONObject) args[0];
                        String socketID;
                            try{
                            socketID = obj.getString("SocketID");
                        }catch (Exception e){
                            throw new RuntimeException(e);
                        }
                        System.out.println("Incoming: " + socketID);
                    }
                });
            }
        });
    }
Java:
void run() throws URISyntaxException {
        connect();
        sockThread();
    }
und in der Main:

Java:
public static void main(String[] args) {
        //launch the application
        SocketHandler socket = new SocketHandler();
        try{
            socket.run();
        }catch (URISyntaxException e){
            e.printStackTrace();
        }

        launch(args);
    }

Nun habe ich auch ein Label und einen Controller dafür:
Code:
 <Label fx:id="textView" layoutX="58.0" layoutY="224.0" prefHeight="57.0" prefWidth="548.0" text="Label" textFill="WHITE" />
Java:
@FXML
    private Label textView;

  public void setText (String string){
        textView.setText(string);
    }

So ich hoffe jemand kann mir helfen wie ich nun meinen String da rein bekomme ^^ :D
Danke für eure Hilfe.

Gruß
JNodex
 

Flown

Administrator
Mitarbeiter
Dein sockThread braucht eine Referenz auf dein Controller um dann lustig: controller.setText(socketId); aufrufen zu können.
 

JNodex

Mitglied
Java:
 private Controller controller;
Das habe ich oben hinzugefügt und unter meinem System.out.println habe ich nun folgendes:
Java:
controller = new Controller();
controller.setText(socketID);
nun haut er mir aber einen Error raus:

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.NullPointerException
at SocketHandler$1$1.run(SocketHandler.java:36)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NullPointerException
at Controller.setText(Controller.java:32)
at SocketHandler$1$1.run(SocketHandler.java:34)


Ich hoffe ich stell mich grade nicht zu dämlich an ^^
 

mrBrown

Super-Moderator
Mitarbeiter
Das innere des Setters solltest du in ein Platform.runLater kapseln - GUI-Änderungen dürfen nur durch den zuständigen Thread stattfinden, und damit "verschiebst" du es in diesen

Edit: Verlesen, sehe grad das machst du beim Empfangen direkt...

Du erstellst dir einen neunen Controller, der die FXML-Datei nicht kennt, deshalb sind die Felder auch nicht gesetzt - du solltest den entsprechend mit FXMLLoader laden, anstatt ihn mit new zu erzeugen
 

JNodex

Mitglied
Das innere des Setters solltest du in ein Platform.runLater kapseln - GUI-Änderungen dürfen nur durch den zuständigen Thread stattfinden, und damit "verschiebst" du es in diesen
Das hab ich doch:
Java:
 private void sockThread (){
        mSocket.on("SocketID", new Emitter.Listener() {
             public void call(final Object... args) {
                Platform.runLater(new Runnable() {
                    public void run() {
                        JSONObject obj = (JSONObject) args[0];
                        String socketID;
                            try{
                            socketID = obj.getString("SocketID");
                        }catch (Exception e){
                            throw new RuntimeException(e);
                        }
                        System.out.println("Incoming: " + socketID);
                        controller = new Controller();
                        controller.setText(socketID);
                    }
                });
            }
        });
    }

Oder meinst du was anderes ?!
 

JNodex

Mitglied
Ist auch schon editiert gewesen - habs nicht da erwartet und deshalb auch nicht danach geguckt ;)
Okay ja ^^ gesehen :)
Ich hab dein Rat befolgt und folgendes gemacht:
Java:
 FXMLLoader loader = new FXMLLoader(
                                getClass().getResource(
                                        "sample.fxml"
                                )
                        );
                        try {
                            Pane pane = loader.load();
                            Controller controller = loader.<Controller>getController();
                            controller.setText(socketID);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

Nun bekomm ich gott sei dank keine Error meldung mehr aber es passiert auch nichts mit dem Label ^^

Also er geht in die funktion setText rein aber dort macht er scheinbar nichts
 

JNodex

Mitglied
Das Label ist auch noch überhaupt nicht sichtbar, oder?
Doch das Label ist sichtbar.
Fett und groß ^^
Code:
 <Label fx:id="textView" layoutX="58.0" layoutY="224.0" prefHeight="57.0" prefWidth="548.0" text="Label" textFill="WHITE" />

Wenn ich in die funktion:
Java:
  public void initialize () {
        // initialization here, if needed...
    }
in meinem controller gehe und dort setText("Hallo"); ausführen lasse funktioniert es komischer weise.
 

JNodex

Mitglied
Du lädst die FXML auch direkt schon zum Programmstart, oder?
Das ist die Main Class die schlussendlich alles ausführt:
Java:
public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        // get the fxml file --> Frontend !
        Parent root = FXMLLoader.load(getClass().getClassLoader().getResource("sample.fxml"));
        stage.initStyle(StageStyle.UNDECORATED);
        Scene scene = new Scene(root);
        stage.setScene(scene);

        //render the scene
        stage.show();
    }

    public static void main(String[] args) {
        //launch the application
        SocketHandler socket = new SocketHandler();
        try{
            socket.run();
        }catch (URISyntaxException e){
            e.printStackTrace();
        }
        launch(args);
    }
}

und im SocketHandler lade ich die FXML im sockthread dort wo vorher System.out.println(); stand
 

mrBrown

Super-Moderator
Mitarbeiter
Du lädst die FXML zwei mal (und damit auch zwei Controller) - angezeigt wird das in Main geladene, das in deinem SocketHandler geladene wird nie angezeigt, und deshalb siehst du die Änderungen an der Instanz auch nicht.

Du musst die in Main geladene Instanz des Controllers an den SocketHandler übergeben
 

JNodex

Mitglied
Du lädst die FXML zwei mal (und damit auch zwei Controller) - angezeigt wird das in Main geladene, das in deinem SocketHandler geladene wird nie angezeigt, und deshalb siehst du die Änderungen an der Instanz auch nicht.

Du musst die in Main geladene Instanz des Controllers an den SocketHandler übergeben

Okay, könntest du mir evtl nen tipp geben wie ?
 

JNodex

Mitglied
Okay passt :) hab es danke euch

Lösung:
Java:
 FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("sample.fxml"));
        Parent root = loader.load();
        Controller controller = loader.getController();
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Juelin Netbeans mit JavaFX, FXML und Scenebuilder Java Basics - Anfänger-Themen 11
Juelin javaFX mit Elementen Java Basics - Anfänger-Themen 6
Juelin Netbeans und javafx Java Basics - Anfänger-Themen 6
M Wo den Ordner javafx-sdk-21.0.2 unter Linux ablegen? Java Basics - Anfänger-Themen 5
A Kapazität JavaFX TextField Java Basics - Anfänger-Themen 4
L JavaFX - grundlegende Verständnisprobleme Java Basics - Anfänger-Themen 1
S JavaFX Java Basics - Anfänger-Themen 1
A JavaFX-Anwendung läuft nicht mit Selenium WebDriver Java Basics - Anfänger-Themen 0
A JavaFX Toggle_Button_Disable Java Basics - Anfänger-Themen 2
ac83 JavaFX - Kompilierungsproblem Java Basics - Anfänger-Themen 1
R Intellij javafx --> jar Java Basics - Anfänger-Themen 11
O Compiler-Fehler JavaFX fmxl LoadExeption Java Basics - Anfänger-Themen 4
M Javafx Timeline Java Basics - Anfänger-Themen 2
sserio Wieso funktioniert mein TableView nicht /JavaFX. Java Basics - Anfänger-Themen 4
A JavaFX-Filechooser Java Basics - Anfänger-Themen 5
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
A JavaFx - SceneBuilder Java Basics - Anfänger-Themen 5
S JavaFX - Objekt an neue Stage übergeben Java Basics - Anfänger-Themen 12
G Javafx Eventhandler zu jedem Node Java Basics - Anfänger-Themen 1
T Elemente aus Array zu TableView JavaFX übertragen Java Basics - Anfänger-Themen 2
T HTMLEditor JavaFX Java Basics - Anfänger-Themen 4
E JavaFX Editor Probleme mit der Zwischenablage Java Basics - Anfänger-Themen 12
E JavaFX Taschenrechner Eingabe im Textfield beschränken Java Basics - Anfänger-Themen 2
D Mit Objekten rechnen, Textfield, JavaFX, Noob Java Basics - Anfänger-Themen 8
P Probleme bei der Installation von JavaFX Java Basics - Anfänger-Themen 3
R Umsetzungsplan JavaFx App Java Basics - Anfänger-Themen 9
M JavaFX- Verschiedene Stages Java Basics - Anfänger-Themen 1
P JavaFx einrichten Java Basics - Anfänger-Themen 6
Torsten.E JavaFX mit Visual Studio Code verwenden Java Basics - Anfänger-Themen 1
P JavaFX: Verständnisproblem bei ComboBox/ChoiceBox etc. Java Basics - Anfänger-Themen 9
T Javafx ListView kann nicht gefüllt werden. Java Basics - Anfänger-Themen 6
D JAVAFX WebVIEW zu JSOUP Java Basics - Anfänger-Themen 3
D Folgende Fehlermeldung bei der Installation von JAVAFX Java Basics - Anfänger-Themen 1
S JavaFX-Arduino Kommunikation mit LCD-Anzeige Java Basics - Anfänger-Themen 0
B java.lang.NullPointerException bei javafx Java Basics - Anfänger-Themen 10
J javafx mediaplayer mit https Java Basics - Anfänger-Themen 3
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
D Ausführbare jar/exe aus JAVAFX Projekt erstellen (IntelliJ) Java Basics - Anfänger-Themen 14
O JavaFX XML Versuch Java Basics - Anfänger-Themen 2
O JavaFX Java Basics - Anfänger-Themen 7
M JavaFX-Übung Autospiel Java Basics - Anfänger-Themen 4
M JavaFX: Fenster bleibt weiß Java Basics - Anfänger-Themen 3
L Klassen NFC Reader und JavaFx Problem -> threads? Java Basics - Anfänger-Themen 2
J Aktuelle Zeit in einer JavaFX Anwendung aktualisieren lassen Java Basics - Anfänger-Themen 4
L JavaFx ListView rechts abgeschnitten Java Basics - Anfänger-Themen 0
I Javafx Tabpane Reiter blockieren Java Basics - Anfänger-Themen 1
S JavaFX Beginneraufgabe Java Basics - Anfänger-Themen 1
W JavaFX import Fehler/Zellularautomaten Java Basics - Anfänger-Themen 1
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
CptK mit javafx button erstellen Java Basics - Anfänger-Themen 1
U Javafx Array aus Buttons Java Basics - Anfänger-Themen 2
D JavaFX Vererbung Java Basics - Anfänger-Themen 2
E JAvaFX: Verschiedene Panels nach Klick auf Node des TreeView anzeigen Java Basics - Anfänger-Themen 0
K Erste Schritte JavaFX - wie von "externer" Klasse auf Methoden des Controllers zugreifen Java Basics - Anfänger-Themen 2
D JavaFX, Verweis auf Datei im Projekt Java Basics - Anfänger-Themen 0
M JavaFX in Swing-Applikationen einbetten Java Basics - Anfänger-Themen 5
M JavaFX: Problem mit der TableView Java Basics - Anfänger-Themen 0
P JavaFX ohne FXMLLoader Java Basics - Anfänger-Themen 3
K JavaFX UI controls Java Basics - Anfänger-Themen 1
B Farbverlauf erstellen ohne Javafx, AWT usw.? Java Basics - Anfänger-Themen 34
H Best Practice JavaFX TableView mit Zell-Rahmen anstelle von Zeilen-Balken Java Basics - Anfänger-Themen 1
M Ausgabe eines Arrays auf Label (Javafx) Java Basics - Anfänger-Themen 4
K Threads Multithread in JavaFx Java Basics - Anfänger-Themen 11
R Threads in JavaFX Java Basics - Anfänger-Themen 3
N JavaFX - (Controller) - Klasse verkleinern Java Basics - Anfänger-Themen 8
U JavaFX eine Vbox Instanz pro Pane? Java Basics - Anfänger-Themen 2
Spencer Reid JavaDoc zu JavaFx hinzufügen Java Basics - Anfänger-Themen 1
V wie kann man am einfachsten für ein Element der JavaFX die Umrandung aktiwieren ? auch ohne css ? Java Basics - Anfänger-Themen 4
D OOP JavaFX objektorientiert Java Basics - Anfänger-Themen 2
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
P JavaFX - Komponenten skalieren Java Basics - Anfänger-Themen 16
P JavaFX Textfelder geben immer null zurück Java Basics - Anfänger-Themen 8
P JavaFX TextArea.setText Java Basics - Anfänger-Themen 13
F javafx.fxml.LoadException: Root hasn't been set. Java Basics - Anfänger-Themen 0
J JavaFX aus Java-Application heraus starten Java Basics - Anfänger-Themen 7
T Swing, SWT oder JavaFX Java Basics - Anfänger-Themen 8
S [JavaFX 2.1] - Eigene Sprachauswahl? Java Basics - Anfänger-Themen 4
D Javafx XYChart Variable in Schleife erzeugen? Java Basics - Anfänger-Themen 18
E JavaFX und Java auf Kommandozeile compilen Java Basics - Anfänger-Themen 2
J Webanwendung JavaFX Java Basics - Anfänger-Themen 4
Povlsen84 [javafx] Zusammenarbeit mit Tomcat Java Basics - Anfänger-Themen 4
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben