私はFXMLのGoogleマップマーカーを定期的に更新しようとしています。私はタイマーと新しいThread
でこれをしようとしましたが、それを動作させることはできません。Java FXML新しいスレッドスローエラーでUIを更新する
新しいThread
を私のUIのTextField
を更新する簡単なタスクでテストしましたが、うまくいきます。
しかし、私はマップ更新する必要があり、実際のコードを使用する場合:
@FXML
public void handleTracking() throws IOException, InterruptedException {
new Thread() {
@Override
public void run() {
while (true) {
try {
double ar[] = FileImport.getGpsPosition();
System.out.println("Latitude: " + ar[0] + " Longitude: " + ar[1]);
double Ltd = ar[0];
double Lng = ar[1];
webEngine.executeScript(""
+ "window.lat = " + Ltd + ";"
+ "window.lon = " + Lng + ";"
+ "document.goToLocation(window.lat, window.lon);");
try {
Thread.sleep(555);
} catch (InterruptedException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (IOException ex) {
Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}.start();
}
私は、出力メッセージを取得する:
Exception in thread "Thread-26" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-26
at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:236)
at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423)
at javafx.scene.web.WebEngine.checkThread(WebEngine.java:1216)
at javafx.scene.web.WebEngine.executeScript(WebEngine.java:980)
at de.fkfs.v2x.eval.FXMLDocumentController$1.run(FXMLDocumentController.java:84=)
私はタイマーを使用するときに同じようなことが起こります、ラベルを更新する作業のために機能しますが、マーカー位置を更新しようとすると、メッセージをスローします。
Exception in thread "Timer-0" java.lang.IllegalStateException: Not on FX application thread; currentThread = Timer-0
[java.lang.IllegalStateExceptionの可能な複製:FXアプリケーションスレッドではありません。 currentThread = Thread-4](http://stackoverflow.com/questions/29449297/java-lang-illegalstateexception-not-on-fx-application-thread-currentthread-t) – DVarga
UIを更新する例は、ここで別のスレッド:http://stackoverflow.com/documentation/javafx/2230/threading/7291/updating-the-ui-using-platform-runlater#t=201607280912032640534 – fabian