我想加载一个JavaFX的WebView一些内容或页面,并提供一个桥梁对象到Java所以页面的内容可以做电话到Java。
如何做到这一点的基本概念描述如下: https://blogs.oracle.com/javafx/entry/communicating_between_javascript_and_javafx
现在我的问题是:当是一个好时机注入桥对象到的WebView所以它是可以尽快。
这里所描述的一种选择是页面加载后: https://stackoverflow.com/a/17612361/1520422
但是,有没有办法来注入这个越早(页面之前内容本身进行初始化),所以桥对象可在页加载(而不是仅在页面加载)?
由于没有人回答,我会告诉你我是如何做的,尽管它是丑陋的。 这为网页正常运行在非Java环境但在Java环境中收到的Java对象的能力。
我通过提供启动onStatusChanged
处理器的WebEngine
。 它侦听的魔法值window.status
。 如果接收到魔法值,处理程序安装Java对象。 (对我来说,这是比较复杂的,因为我有一些更复杂的业务流程:我在执行一个脚本,提供该页面的客户端API,然后设置另一个魔法值window.status
使Java对象是发送到客户端侧API的初始化方法)。
然后在我的目标页,我在页面的第一个脚本如下代码:
window.status = "MY-MAGIC-VALUE";
window.status = "";
这段代码基本上是一个无操作在一个“正常”的浏览器,但触发初始化自定义JavaFX的嵌入运行时。
在Java 8中,您可以触发事件改变从预定RUNNING此时注入对象。 对象将呈现WebEngine的JavaScript运行之前。 Java 7中,我看到了状态机相当不同的操作,没有对Java 7中给出的解决方案。
webEngine.getLoadWorker().stateProperty().addListener(
new ChangeListener<State>(){
public void changed(ObservableValue<? extends State> ov,
State oldState,
State newState)
{
// System.out.println("old: "+oldState+", new: "+newState);
if(newState == State.RUNNING &&
oldState == State.SCHEDULED){
JSObject window = (JSObject)webEngine.executeScript("window");
window.setMember("foutput", foutput);
}
}
});