在页面加载之前在JavaFXWebView中插入桥接代码?

在页面加载之前在JavaFXWebView中插入桥接代码?,webview,javafx,javafx-2,javafx-8,Webview,Javafx,Javafx 2,Javafx 8,我想在JavaFXWebView中加载一些内容或页面,并向Java提供一个桥接对象,以便页面内容可以调用Java 这里描述了如何进行此操作的基本概念: 现在我的问题是:什么时候将bridge对象注入WebView以便它尽快可用 一个选项是页面加载后,如下所述: 但是有没有一种方法可以更快地(在页面内容本身初始化之前)注入它,从而使桥接对象在页面加载期间可用(而不仅仅是在页面加载之后)?由于没有人回答,我将告诉您我是如何做的,尽管它很难看。这使页面能够在非Java环境中正常工作,但在Java环境中

我想在JavaFXWebView中加载一些内容或页面,并向Java提供一个桥接对象,以便页面内容可以调用Java

这里描述了如何进行此操作的基本概念:

现在我的问题是:什么时候将bridge对象注入WebView以便它尽快可用

一个选项是页面加载后,如下所述:


但是有没有一种方法可以更快地(在页面内容本身初始化之前)注入它,从而使桥接对象在页面加载期间可用(而不仅仅是在页面加载之后)?

由于没有人回答,我将告诉您我是如何做的,尽管它很难看。这使页面能够在非Java环境中正常工作,但在Java环境中接收Java对象

我首先向
WebEngine
提供一个
onStatusChanged
处理程序。它将侦听
窗口的神奇值。状态
。如果收到magic值,处理程序将安装Java对象。(在我的例子中,它更复杂,因为我有一些更复杂的编排:我正在执行一个脚本,为页面提供客户端API,然后在
window.status
上设置另一个神奇的值,以使Java对象发送到客户端API的初始化方法)

然后在我的目标页面中,我在页面的第一个脚本中有以下代码:

window.status = "MY-MAGIC-VALUE";
window.status = "";

此代码在“普通”浏览器中基本上是无操作的,但在自定义JavaFX嵌入中运行时会触发初始化。

在Java 8中,您可以触发事件从计划更改为运行,以在此时插入对象。这些对象将在运行JavaScript之前出现在WebEngine中。Java7,我看到状态机在操作上有很大的不同,没有为Java7提供解决方案

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);
             }
         }
});
webEngine.getLoadWorker().stateProperty().addListener(
新的ChangeListener(){

我已经自己找到了这个解决方案。无论如何,谢谢。我希望有一个更像是为这个目的设计的东西……但我还是接受了你的解决方案。