Update eines Labels bei Methodenaufruf einer anderen Klasse

rocknralle

Mitglied
Hallo liebe Java-Community,
ich probiere verzweifelt folgendes Problem zu lösen:

Ich möchte gerne mit der Application (App1.class) starten und diese an die Klasse OtherClass.class in die statische Methode test(App1 app) überführen.
In dieser Methode wird eine while-Schleife vielfach ausgeführt. Innerhalb der Schleife habe ich eine Random-Funktion eingebaut, die beim Wert = 1 wieder zurück auf die Klasse App1 zugreift - und zwar auf die Methode update(String txt).
Dort möchte ich dann (wie auch immer?) den Text des Labels aus App1 verändern und anzeigen lassen. Leider funktioniert das gar nicht. So wie ich das unten vorstelle, wird beim Ausführen nur ein leeres Fenster angezeigt, bis der Algorithmus aus OtherClass.class abgearbeitet ist.

Ich hatte auch schon viel mit Threads sowie property-bindings rumprobiert und bin immer noch zu keiner Lösung gekommen... Das müsste doch ein multithreading-Problem von JavaFX sein?!

Java:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class App1 extends Application{
   
    Label label;
    int count;
   
    public void start(Stage stage){
       
        label = new Label("start...");
        Pane pane = new Pane(label);
        Scene scene = new Scene(pane, 250, 30);
        stage.setScene(scene);
        stage.show();
        
        OtherClass.test(this);
    }
   
    public void update(String txt){
        label.setText(txt);
    }
   
    public static void main(String[] args){
        launch(args);
    }
}

import java.util.Random;
public class OtherClass {
   
    public static void test(App1 app){
       
        Random r = new Random();
        int count=0;
       
        while(count<10000000){
            if(r.nextInt(4)+1 == 1)
                 app.update("Treffer in Runde = "+count);           
            
            count++;
        }
    }
}

Für Hilfe wäre ich äußerst dankbar. :)
Viele Grüße
 

thet1983

Top Contributor
Java:
public static void test(MainApp app) {
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                Random r = new Random();
                int count = 0;

                while (count < 10000000) {
                    if (r.nextInt(4) + 1 == 1) {
                        app.update("Treffer in Runde = " + count);
                    }

                    count++;
                }
            }
        });
    }
 

thet1983

Top Contributor
naja er sagte ja er hat es mit threads probiert....anscheinend nicht mit dem javafx standart und den hab ich in seiner test methode eingefügt.
also wo liegt jetzt das problem @Robat ?
 

dzim

Top Contributor
Nein, ist es nicht. Man kann auch - wie ich es gern tue - sich über schlechtes Deutsch aufregen. ;):p

Um dem @rocknralle mal zu erklären, was konkret schief gegangen ist, empfehle ich als erstes folgende Literatur:
https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm

Durch das Studium eben dieser sollte klar werden, dass es nie eine gute Idee ist, Zeit-intensive Arbeit auf dem selben Thread zu verrichten, der sich auch um das Updaten der Oberfläche kümmern soll. Da dieser Teil sozusagen prozedural abläuft, können Updates an der UI erst dann gemacht werden, wenn die Arbeit abgeschlossen ist.
Lösung? Einfach! Verwende Threads! Oder im JavaFx-Context eben Tasks (die auch über Threads gestartet werden) und noch besser: Services.
 

dzim

Top Contributor
@thet1983 mit Platform#runLater in dem wieder die while-Schleife enthalten ist, wird aber auch wieder die gesamte Arbeit auf dem UI-Thread gemacht. Das ist also auch wieder falsch.

Es müsste also eher ungefähr so aussehen:
Java:
new Thread(() -> {
            Random r = new Random();
            int count = 0;
            while (count < 10000000) {
                if (r.nextInt(4) + 1 == 1) {
                    Platform.runLater(() -> app.update("Treffer in Runde = " + count));
                }
                count++;
            }
        }).start();
Wobei das immer noch eher die hässliche Dampfhammer-Methode ohne gute Kontrolle über die Threads ist - besser ist es, Services und Tasks zu verwenden!
 

thet1983

Top Contributor
kann man das verwenden?

Java:
public static void test(MainApp app) {
        Task<Void> task;
        task = new Task<Void>() {
            @Override
            protected Void call() throws Exception {
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        Random r = new Random();
                        int count = 0;
                        while (count < 10000000) {
                            if (r.nextInt(4) + 1 == 1) {
                                app.update("Treffer in Runde = " + count);
                            }
                            count++;
                        }
                    }
                });
                return null;
            }
        };

        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();

    }
 

rocknralle

Mitglied
Vielen, vielen Dank für eure Hilfe!!! Wie es aussieht, habe ich das Problem folgendermaßen gelöst:

Java:
import java.util.Random;

import javafx.application.Platform;
import javafx.concurrent.Task;

public class OtherClass {

    public static void test(App1 app) {

        Random r = new Random();
        
        Task task = new Task<Void>() {
           
            @Override
            protected Void call() throws Exception {
                int count = 0;
                while (count < 10000000) {
                    final int counter = count;
                    if (r.nextInt(4) + 1 == 1)
                        Platform.runLater(new Runnable() {
                            @Override
                            public void run() {
                                app.update("Treffer in Runde = " + counter);
                            }
                        });
                    count++;
                   
                    try {
                         Thread.sleep(10);
                     } catch (InterruptedException interrupted) {
                         if (isCancelled()) {
                             updateMessage("Cancelled");
                             break;
                         }
                     }
                }
                return null;
            }
        };
        Thread thread = new Thread(task);
        thread.setDaemon(true);
        thread.start();
        
    }
}

Mein Fehler war es, dass ich den Task immer in der update-Methode starten wollte...


Erst hatte ich mich gewundert, warum die Anzeige so stolpert, aber dann ist mir wieder eingefallen, dass ich eine Random-Funktion eingebaut habe. :-D
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
T ProgressBox - Update AWT, Swing, JavaFX & SWT 9
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
G update, paintComponent AWT, Swing, JavaFX & SWT 1
T GUI Update /EDT AWT, Swing, JavaFX & SWT 7
izoards JavaFX Concurrency Update UI AWT, Swing, JavaFX & SWT 35
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
A Verständnisfragen im Umgang mit update() und JFrames AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
W Swing ProgressBar update AWT, Swing, JavaFX & SWT 4
B IconImage update im Tabbedpane AWT, Swing, JavaFX & SWT 3
M Update überschreiben klappt nicht AWT, Swing, JavaFX & SWT 4
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
El_Lobo Swing bei Update von Graphik Koordinatensystem nicht jedesmal neu zeichnen AWT, Swing, JavaFX & SWT 2
M Update JPanel AWT, Swing, JavaFX & SWT 12
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
E Swing Update JTable AWT, Swing, JavaFX & SWT 6
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
E Swing JTextField Listener nach Update?! AWT, Swing, JavaFX & SWT 2
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
N Tablle nach SQL-Update neu Laden AWT, Swing, JavaFX & SWT 4
M SWT grabExcessHorizontalSpace update ? refresh ? AWT, Swing, JavaFX & SWT 6
P Observer und GUI Update AWT, Swing, JavaFX & SWT 2
w0ddes Swing Update: Laufendes GUI updaten AWT, Swing, JavaFX & SWT 8
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
M Swing Kein update bei simulierten HTML-Link AWT, Swing, JavaFX & SWT 4
C SWT Shell update probleme - Mausbewegung nötig AWT, Swing, JavaFX & SWT 2
hdi Swing GUI update vs. Process Speed AWT, Swing, JavaFX & SWT 31
hdi Swing Gui Update Problem (EDT) AWT, Swing, JavaFX & SWT 6
C JList update über tabbedPane? AWT, Swing, JavaFX & SWT 18
M Update einer JTEextArea AWT, Swing, JavaFX & SWT 2
H JTable mySQL Update AWT, Swing, JavaFX & SWT 8
S Update des fensters beim Ersetzen von JPanels AWT, Swing, JavaFX & SWT 9
G Features nach Update löschen AWT, Swing, JavaFX & SWT 2
J Fragen zur Vererbung und Update AWT, Swing, JavaFX & SWT 12
B Update von JLabels AWT, Swing, JavaFX & SWT 2
C Habe Probleme beim Bild laden! *Update 30.11.2006* AWT, Swing, JavaFX & SWT 28
C JTreeTable update Problem AWT, Swing, JavaFX & SWT 4
S Probleme mit dem Update einer JList AWT, Swing, JavaFX & SWT 7
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
A Update von Frameinhalt und Scrollbar AWT, Swing, JavaFX & SWT 11
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
C JTable update: Selektion beibehalten AWT, Swing, JavaFX & SWT 12
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
S JMenuBar + update AWT, Swing, JavaFX & SWT 3
G JTree - ungültiger selection update AWT, Swing, JavaFX & SWT 2
G Problem mit JLabel Update AWT, Swing, JavaFX & SWT 3
C [JTable] Update der Datenbank AWT, Swing, JavaFX & SWT 6
N update()-Methode für Canvas AWT, Swing, JavaFX & SWT 9
A problem mit update nach event, JSplitpane spinnt AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
M GUI Update während der Verarbeitung einer Methode AWT, Swing, JavaFX & SWT 3
M update JTable AWT, Swing, JavaFX & SWT 3
T Problem bei Update von JTables in JTabbedPane AWT, Swing, JavaFX & SWT 2
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
D Swing: GUI-Update-Problem AWT, Swing, JavaFX & SWT 3
J Warum funktioniert das Update des UI nicht? AWT, Swing, JavaFX & SWT 8
I GUI-Update-Probleme AWT, Swing, JavaFX & SWT 2
G Update von JPanel nach Buttonbetätigung AWT, Swing, JavaFX & SWT 1
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0

Ähnliche Java Themen

Neue Themen


Oben