我正在尝试在WebView上执行javascript并获取输出。可以,但是尝试在线程中执行此操作时出现错误:
@FXML
private void handleButtonAction(ActionEvent event) throws InterruptedException {
int x = this.test();
System.out.print(x);
}
private int test()
{
return (Integer) engine.executeScript("function x(){return 3}; x();");
}
给出输出“ 3”并且没有抛出异常,但是当我执行时:
public void exampleThread() {
Thread one = new Thread() {
public void run() {
while (true) {
try {
System.out.println("Does it work?");
Thread.sleep(1000);
int y = test();
System.out.println("Nope: "+y);
} catch (InterruptedException v) {
System.out.println(v);
}
}
}
};
one.start();
}
它抛出:
线程“ Thread-12”中的异常java.lang.IllegalStateException:在FX应用程序线程上不; currentThread =线程12 在com.sun.javafx.tk.Toolkit.checkFxUserThread(Toolkit.java:279) 在com.sun.javafx.tk.quantum.QuantumToolkit.checkFxUserThread(QuantumToolkit.java:423) 在javafx.scene.web.WebEngine.checkThread(WebEngine.java:1243) 在javafx.scene.web.WebEngine.executeScript(WebEngine.java:1003) 在testApp.FXMLDocumentController.test(FXMLDocumentController.java:91) 在testApp.FXMLDocumentController.access $ 000(FXMLDocumentController.java:28) 在testApp.FXMLDocumentController $ 1.run(FXMLDocumentController.java:76)
有人知道这是怎么回事吗?
答案 0 :(得分:0)
您正在使用JavaFX内部的WebEngine-它似乎想在JavaFX应用程序线程中运行,这是您在handleButtonAction()
中执行事件处理程序时所处的位置-但是在运行时却没有你自己的线程。最简单的解决方案是在JavaFX线程中运行测试方法(查找Platform.invokeLater()
?),或者您可以将脚本交给Java中的JavaScript引擎,而不是JavaFX中的脚本引擎(这样可以释放您的精力)不必在JavaFX应用程序线程中运行...)