JavaFX JSObject几分钟后停止工作?

时间:2017-10-14 12:16:28

标签: java javafx javafx-webengine jsobject

我正在制作一个基于网络的应用程序,Java支持某些特定请求(例如每次都不打印机打印),而且有些东西让我疯狂

我使用JavaFX来实例化浏览器对象,一切正常,但当然我需要从JavaScript到Java进行回调,这里是代码:

...
...
we.getLoadWorker().stateProperty().addListener( new ChangeListener<Worker.State>()
    {
        @Override
        public void changed(ObservableValue<? extends State> observable, State oldValue, State newValue)
        {
            if ( newValue == Worker.State.SUCCEEDED )
            {
                bridge = new Bridge();
                JSObject jsobj = (JSObject) we.executeScript( "window" );
                jsobj.setMember( "app", new Bridge() );
            }

            if ( newValue == Worker.State.CANCELLED )
            {
                System.out.println( newValue );
                System.out.println( "An error accourred" );
            }
        }
    });
    ...
    ...

这可以工作但是几分钟之后桥接stoo完全工作,javascript不能再回调了,如果我尝试在“app”对象上做一个alert()它返回我未定义。 我正在使用JDK9

1 个答案:

答案 0 :(得分:2)

使解决方案更加明显:@sillyfly建议的方法有效。

不是为每个状态更改创建新的Bridge(或在我的情况下为Console)实例,而是每次都创建一个实例并重新分配。以下几行。

public class AppController {
    public WebView webview;

    @FXML
    public void initialize() {
        final Console console = new Console();
        final WebEngine engine = webview.getEngine();
        engine.setJavaScriptEnabled(true);
        engine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
            @Override
            public void changed(ObservableValue<? extends Worker.State> observable, Worker.State oldValue, Worker.State newValue) {
                final JSObject window = (JSObject) engine.executeScript("window");
                window.setMember("console", console);
            }
        });
    }

    public class Console {
        public void log(String text) {
            System.out.println("[WebView console] " + text);
        }
    }
}