问题
我花了几个小时试图确定为什么我的分布式代码会失败,但是在使用 IDE (NetBeans) 进行调试时我的源代码可以正常工作。我找到了解决方案,并发布以帮助可能有类似问题的其他人。顺便说一句:我是一名自学成才的程序员,可能缺少一些基本概念——请随时教育我。
背景资料
在 JavaFX 应用程序中使用 WebView 控件,我从 html 文件加载网页。我想使用 JavaScript 来处理 HTML 方面的事情,但我还需要在 Java 和 JavaScript 之间自由传递信息(双向)。非常适合使用 WebEngine.executeScript() 方法进行 Java 发起的传输,并使用 Java 中的 JSObject.setMember() 为 JavaScript 启动向 Java 传输信息的方式。
设置链接(这种方式稍后会中断):
/*Simple example class that gives method for
JavaScript to send text to Java debugger console*/
public static class JavaLink {
public void showMsg(String msg) {
System.out.println(msg);
}
}
...
/*This can be added in the initialize() method of
the FXML controller with a reference to the WebEngine*/
public void initialize(URL url, ResourceBundle rb) {
webE = webView.getEngine();
//Retrieve a reference to the JavaScript window object
JSObject jsObj = (JSObject)webE.executeScript("window");
jsObj.setMember("javaLink", new JavaLink());
/*Now in our JavaScript code we can type javaLink.showMsg("Hello!");
which will send 'Hello!' to the debugger console*/
}
在分发它并尝试运行 JAR 文件之前,上面的代码将运行良好。经过数小时的搜索和测试不同的调整后,我终于将问题缩小到 JavaLink 对象本身(我最终了解到您可以在 JavaScript 中使用 try-catch 块,这使我能够捕获错误:“ TypeError: showMsg is not a function. .. ”)。