Java.lang.IllegalStateException: Pas sur FX thread d'application; currentThread = Thread-4

j'essaie de définir la chaîne d'un objet texte à partir d'un Thread mais il me donne cette erreur:

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.Scene.addToDirtyList(Unknown Source)
at javafx.scene.Node.addToSceneDirtyList(Unknown Source)
at javafx.scene.Node.impl_markDirty(Unknown Source)
at javafx.scene.shape.Shape.impl_markDirty(Unknown Source)
at javafx.scene.Node.impl_geomChanged(Unknown Source)
at javafx.scene.text.Text.impl_geomChanged(Unknown Source)
at javafx.scene.text.Text.needsTextLayout(Unknown Source)
at javafx.scene.text.Text.needsFullTextLayout(Unknown Source)
at javafx.scene.text.Text.access0(Unknown Source)
at javafx.scene.text.Text.invalidated(Unknown Source)
at javafx.beans.property.StringPropertyBase.markInvalid(Unknown Source)
at javafx.beans.property.StringPropertyBase.set(Unknown Source)
at javafx.beans.property.StringPropertyBase.set(Unknown Source)
at javafx.scene.text.Text.setText(Unknown Source)
at uy.com.vincent.fx.handling.TableController.run(TableController.java:70)

Gestionnaire Classe:

@FXML
private Text timer;

@Override
public void initialize(URL url, ResourceBundle rb) {
    init();
    new Thread() {
        public void run() {
            while(true) {
                Calendar cal = new GregorianCalendar();

                int hour = cal.get(cal.HOUR);
                int minute = cal.get(cal.MINUTE);
                int second = cal.get(cal.SECOND);
                int AM_PM = cal.get(cal.AM_PM);

                String time = hour + "" + minute + "" + second;
                timer.setText(time);
            }
        }
    }.start();
}

je suis un tutoriel. Le type du tutoriel n'utilise pas JavaFX.

j'ai essayé d'utiliser Platform.runLater(), ça marche mais ça casse mon programme. J'ai aussi essayé de créer une minuterie sur le Platform.runLater(new Runnable() { }) méthode, mais il me donne la même erreur qu'avant.

8
demandé sur Vicente Bermúdez 2015-04-04 20:21:11

1 réponses

Wrap timer.setText()Platform.runLater(). À l'extérieur, à l'intérieur de la boucle while, ajouter Thread.sleep(1000);

la raison derrière L'Exception de L'État illégal est que vous essayez de mettre à jour L'interface utilisateur sur un thread autre que le thread D'Application JavaFX.

la raison pour laquelle votre application s'est écrasée quand vous avez ajouté c'était que vous surchargiez le thread de L'UI en ajoutant un processus à exécuter sur le thread de L'UI à l'infini. Faire dormir le fil pendant 1000ms vous aidera à surmonter le problème.

si possibilité de remplacer while (true) par une minuterie ou un TimerTask.

pour plus d'options, suivez ce lien

17
répondu ItachiUchiha 2017-05-23 10:31:23