JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat

marc_book

Mitglied
Hallo,
ich programmiere gerade ein kleines Tool, welches die Position aller Clients auf einer Karte(Bild) anzeigen soll. Da beliebig viele Clients online sein können, möchte ich gerne jedes mal, wenn ein Client verbindet ein neues Label an einer beliebigen Position erstellen. Gibt es eine Möglichkeit, Labels nach dem Erstellen der GUI noch zu laden? Ich möchte nämlich nicht 200 Labels definieren.
 

Joose

Top Contributor
Du kannst doch einfach im entsprechenden Controller per "Label l = new Label()" ein neues Label erzeugen und der entsprechenden Komponenten hinzufügen.
 

marc_book

Mitglied
Hallo,
danke für deine Antwort, ich habe es nun wie folgt versucht, jedoch habe bekomme ich dabei folgen den Fehler.

Main.java
Java:
package application;

import java.io.IOException;

public class Main {
    public static void main(String[] args) throws IOException {
        javafx.application.Application.launch(Gui.class);
    }
}

Gui.java
Java:
package application;

public class Gui extends Application {  
    public static TextArea debugConsole = new TextArea("Console gestartet!");
//    public static Label p1, p2, p3, p4, p5 = new Label("");
  
    public void start(Stage primaryStage) {
              
        MenuBar menuBar = new MenuBar();
      
        Menu menuFile = new Menu("File");
        MenuItem itemSave = new MenuItem("Save");
        menuFile.getItems().addAll(itemSave);
      
        Menu menuOptions = new Menu("Options");
        MenuItem itemUpdates = new MenuItem("Search for Updates");
        MenuItem itemSettings = new MenuItem("Settings");
        MenuItem itemDebugConsole = new MenuItem("Debug Console");
        menuOptions.getItems().addAll(itemUpdates, itemSettings, itemDebugConsole);
      
        menuBar.getMenus().addAll(menuFile, menuOptions);
      
      
      
        ScrollPane scroll = new ScrollPane();
        scroll.setPannable(true);
        BorderPane border = new BorderPane();
        Thread t = new Thread(new Server(border));
        t.start();
      
        Image image = new Image(getClass().getResourceAsStream("/maps/altis.png"));
        ImageView imgMap = new ImageView(image);
        scroll.setContent(imgMap);
      
        final DoubleProperty zoomProperty = new SimpleDoubleProperty(400);
        zoomProperty.addListener(new InvalidationListener() {
          
        @Override
        public void invalidated(Observable observable) {
            imgMap.setFitWidth(zoomProperty.get());
            imgMap.setFitHeight(zoomProperty.get());          
            }
        });
      
        imgMap.setCache(true);
        imgMap.preserveRatioProperty().set(true);
      
        border.addEventFilter(ScrollEvent.ANY, new EventHandler<ScrollEvent>() {

            @Override
            public void handle(ScrollEvent event) {
                if (event.getDeltaY() > 0) {
                    zoomProperty.set(zoomProperty.get() * 1.1);
                } else if (event.getDeltaY() < 0) {
                    zoomProperty.set(zoomProperty.get() / 1.1);
                }              
            }
        });
      
        border.setTop(menuBar);
        border.setCenter(scroll);
        border.setBottom(debugConsole);
        Scene scene = new Scene(border, 400, 500);
        primaryStage.setScene(scene);
        primaryStage.setTitle("marc_book's Navipad");
      
        primaryStage.show();
      
        primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
            @Override
            public void handle(WindowEvent t) {
                Platform.exit();
                System.exit(0);
            }
        });
    }
  
    public static void setDebugConsole(BorderPane border, String message) {
//        String oldText = debugConsole.getText() + "\n";
//        debugConsole.setText(oldText + message);
        if(message.substring(0,1).equals("B")) {
            System.out.println(message);
        }
        Label l = new Label(message);
        border.setRight(l);
    }
}

Server.java
Java:
package application;

public class Server implements Runnable {
    public BorderPane border;
    public Server(BorderPane border) {
        this.border = border;
    }

    @SuppressWarnings("resource")
    public void run() {
        DatagramSocket serverSocket = null;
        try {
            serverSocket = new DatagramSocket(5004);
        } catch (SocketException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }
        byte[] receiveData = new byte[1024];
        @SuppressWarnings("unused")
        byte[] sendData = new byte[1024];
      
        System.out.println("Server hört");
        while (true) {
            DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
            try {
                serverSocket.receive(receivePacket);
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            String sentence = new String( receivePacket.getData());
            Gui.setDebugConsole(border, sentence);
        }      
    }
}

Fehler.
Code:
Exception in thread "Thread-4" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-4
    at com.sun.javafx.tk.Toolkit.checkFxUserThread(Unknown Source)
    at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(Unknown Source)
    at javafx.scene.Parent$2.onProposedChange(Unknown Source)
    at com.sun.javafx.collections.VetoableListDecorator.add(Unknown Source)
    at javafx.scene.layout.BorderPane$BorderPositionProperty.invalidated(Unknown Source)
    at javafx.beans.property.ObjectPropertyBase.markInvalid(Unknown Source)
    at javafx.beans.property.ObjectPropertyBase.set(Unknown Source)
    at javafx.scene.layout.BorderPane.setRight(Unknown Source)
    at application.Gui.setDebugConsole(Gui.java:109)
    at application.Server.run(Server.java:41)
    at java.lang.Thread.run(Unknown Source)
 
Zuletzt bearbeitet von einem Moderator:

dzim

Top Contributor
Die Message in der Exception ist entscheidend: "Not on FX application thread; currentThread = Thread-4"

Du versuchst die GUI von einem Nicht-UI-Thread upzudaten. Das passiert, wenn du versuchst, die "Methode Gui.setDebugConsole(border, sentence);" in deinem "Server"-Thread aufzurufen (siehe Stacktrace).
Lösung: Platform#runLater(Runnable) -> wrappe "Label l = new Label(message); border.setRight(l);" in das Runnable, das du an Platform#runLater übergibst.

Noch zu deinem Code allgemein:
Ich muss sagen, dass ich es nicht sehr sauber finde, dieses Update per statischer Methode zu machen. Oder dass du dazu vorher das BorderPane in den Server geben musst.
Es wäre hier besser den "Server"-Thread von der GUI agnostisch zu machen. Du könntest dir ein zentrales Model vorhalten und dort solche Messages reinpumpen. Die GUI würde auf die Änderungen an diesem Model hören.
Dass du wahrscheinlich dieses Model per Singleton Pattern vorhalten müsstest, ist etwas anderes (liesse sich mit Dependency Injection wenigstens "hübsch" machen).

Grundsätzlich musst du einfach immer bedenken, dass wenn du von einem anderen als dem Main-Thread (auch UI-Thread genannt) die Oberfläche aktualisieren möchtest, musst du Platform#runLater verwenden.
 

marc_book

Mitglied
Ok, danke schon mal für deine Antwort, ich werde mich das Wochenende mal daran machen, den Code so wie du vorschlägst aufzubauen. Zum Glück gibts git :D.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
E GUI-Elemente aus txt- oder xml-File erstellen? AWT, Swing, JavaFX & SWT 5
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
D JavaFX Elemente aus VBox unterscheiden AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
wolfgang63 JavaFX Elemente einer Group entfernen AWT, Swing, JavaFX & SWT 1
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
O Ähnliche GUI Elemente - vererbung?! AWT, Swing, JavaFX & SWT 0
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
M JFrame + JNA/aero modul - GUI Elemente so möglich? AWT, Swing, JavaFX & SWT 28
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
L ID für GUI Elemente generieren AWT, Swing, JavaFX & SWT 11
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
S Swing Elemente einer JList Farbig hinterlegen AWT, Swing, JavaFX & SWT 6
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
T DND mit JList Elemente nicht am Ende einfügen AWT, Swing, JavaFX & SWT 3
Tobse Swing JList elemente hinzufügen AWT, Swing, JavaFX & SWT 4
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
D Elemente werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
W jComboBox unterschiedlich selectable elemente AWT, Swing, JavaFX & SWT 7
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5
C (Swing)GUI-Elemente werden nicht aktualisiert. AWT, Swing, JavaFX & SWT 2
P JList: Reihenfolge der Elemente per Drag'n'Drop ändern. AWT, Swing, JavaFX & SWT 9
M Swing JList - Elemente umbenennen? AWT, Swing, JavaFX & SWT 4
MrMilti Gezeichnete Java2D Elemente mit Events versehen AWT, Swing, JavaFX & SWT 3
H [gelöst] Swing Elemente verdecken AWT, Swing, JavaFX & SWT 14
B In externer Eventhandlerklasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
K BoxLayout skaliert die "falschen" Elemente AWT, Swing, JavaFX & SWT 5
A SWT - Elemente zur Laufzeit ändern AWT, Swing, JavaFX & SWT 6
S Andere Elemente in JComboBox anzeigen AWT, Swing, JavaFX & SWT 2
T Elemente werden nicht direkt angezeigt AWT, Swing, JavaFX & SWT 3
S Nachträglich Swing-Elemente in JFrame erzeugen AWT, Swing, JavaFX & SWT 18
K Titel für eingebundene Elemente wie JPanel AWT, Swing, JavaFX & SWT 3
F Dynamische Swing Elemente AWT, Swing, JavaFX & SWT 10
B Grafische Anordnung der Elemente AWT, Swing, JavaFX & SWT 2
S JComboBox zeigt beim 1. öffnen nur 2 Elemente ? AWT, Swing, JavaFX & SWT 9
J LayoutManager der Elemente untereinander anordnet. AWT, Swing, JavaFX & SWT 11
S Zugriff auf Elemente funktioniert mit SWING nicht mehr AWT, Swing, JavaFX & SWT 5
G JButton und andere J-Elemente: Markierung ausblenden AWT, Swing, JavaFX & SWT 6
Paule alle Elemente eines SWT Trees AWT, Swing, JavaFX & SWT 8
S List Elemente AWT, Swing, JavaFX & SWT 4
G Elemente erst da wenn mit Maus drüber gefahren bin AWT, Swing, JavaFX & SWT 2
J FAQ programmieren, welche Swing-Elemente AWT, Swing, JavaFX & SWT 7
M Elemente hängen dicht aufeinander AWT, Swing, JavaFX & SWT 2
S Falsche Position, Elemente erscheinen nicht, Flackern AWT, Swing, JavaFX & SWT 6
DEvent Je nach Auswahl in Liste entsprechende Input-Elemente anzeig AWT, Swing, JavaFX & SWT 2
W Elemente aus JPanel bzw. GridBag löschen und ersetzen AWT, Swing, JavaFX & SWT 18

Ähnliche Java Themen

Neue Themen


Oben