2015-04-04 2 views
7

Sto cercando di impostare la stringa di un oggetto di testo da un thread, ma mi sta dando questo errore:java.lang.IllegalStateException: Non sul thread dell'applicazione FX; currentThread = Thread-4

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.access$200(Unknown Source) 
at javafx.scene.text.Text$2.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$1.run(TableController.java:70) 

Handler 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(); 
} 

I' m seguito da a tutorial. Il ragazzo nel tutorial non sta usando JavaFX.

Ho provato a utilizzare Platform.runLater(), funziona ma si blocca il programma. Ho anche provato a creare un timer con il metodo Platform.runLater(new Runnable() { }) ma mi dà lo stesso errore di prima.

+1

possibile duplicato del [perché mi appare java.lang.IllegalStateException su JavaFX?] (Http://stackoverflow.com/questions/17850191/why-am-i-getting- java-lang-illegalstateexception-on-javafx) –

+2

'while (true)' è ciò che i professionisti chiamano _bad code_. Assolutamente no, usalo, controlla almeno un 'booleano volatile 'nell'intestazione del ciclo – specializt

risposta

15

Wrap timer.setText() in Platform.runLater(). Al di fuori di esso, all'interno del ciclo while, aggiungi Thread.sleep(1000);

La causa dell'eccezione di stato non valido è che stai cercando di aggiornare l'interfaccia utente su un thread diverso dal thread dell'applicazione JavaFX.

Il motivo per cui la tua app si è bloccata quando hai aggiunto che stavi sovraccaricando il thread dell'interfaccia utente aggiungendo un processo da eseguire sul thread dell'interfaccia utente all'infinito. La sospensione del thread per 1000 ms ti aiuterà a superare il problema.

Se possibile, sostituire (vero) con un Timer o un TimerTask.

Per ulteriori opzioni seguono this link