使用线程/任务更新WebView

时间:2014-01-29 19:09:53

标签: java multithreading user-interface webview javafx-2

我正在尝试使用JavaFx在我的GUI中更新WebView。实际上,当我的任务(需要一点)结束时,我想将一个(本地)html文件加载到WebView。我的控制器类在下面。

@FXML
private WebView bubbleChart;
//...

@FXML
private void startAnalysis(ActionEvent event) {
     Task<Void> topicAnalysis = new MyTrendAnalysis();
     Platform.runLater(topicAnalysis);
   //Thread t = new Thread(topicAnalysis);
   //t.setDaemon(true);
   //t.start();
}

在我的Task类中,有一个方法可以更改WebView的html文件。

private class MyTrendAnalysis extends TrendAnalysis{

    // some other stuff

    @Override
    public void drawResults() {
        try {
            bubbleChart.getEngine().load(new File("path").toURI().toURL().toString());
        } catch (MalformedURLException ex) {
            Logger.getLogger(TabPaneController.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

}

当我使用Platform.runLater();命令时,我的应用程序无响应,直到任务完成。最后更新webview,就像它应该的那样。 当我尝试 Thread-way (评论中的代码)时,我能够与应用程序进行交互(例如更改标签等),但最终WebView没有更新,我得到了:

  

java.lang.IllegalStateException:不在FX应用程序线程上; currentThread = Thread-8       at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:238)       at com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:238)       at com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:400)       在javafx.scene.web.WebEngine.checkThread(WebEngine.java:931)       在javafx.scene.web.WebEngine.load(WebEngine.java:723)       在prototype.TabPaneController $ MyTrendAnalysis.drawResults(TabPaneController.java:233)       在prototype.TopicAnalysis.TrendAnalysis.call(TrendAnalysis.java:342)       在prototype.TopicAnalysis.TrendAnalysis.call(TrendAnalysis.java:33)       在javafx.concurrent.Task $ TaskCallable.call(Task.java:1259)       在java.util.concurrent.FutureTask.run(FutureTask.java:262)       在java.lang.Thread.run(Thread.java:744)

有什么方法可以获得响应行为并更新我的WebView吗?

0 个答案:

没有答案