几分钟后 JavaFX JSObject 停止工作?

标签 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" );
            }
        }
    });
    ...
    ...

这有效,但几分钟后桥接器完全工作,javascript 不能再进行回调,如果我尝试在“应用程序”对象上发出警报(),它会返回未定义的状态。 我正在使用 JDK9

最佳答案

为了使解决方案更加明显:@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);
        }
    }
}

关于几分钟后 JavaFX JSObject 停止工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46744432/

相关文章:

Java 从元素获取文本内容以包含换行符

java - 如何在循环中的 Java 8 lambda 表达式中递增 "number"?

java - 无法从 long[] 转换为 long

javafx - 如何在 JFXtras Labs 8.0 中自定义窗口?

webview - JavaFX 8 WebEngine:如何在Java中将console.log()从javascript获取到System.out?

html - maxlength 属性不适用于 javafx webview

java - 如何使用 JAXB 将 HashTable<String, String> 序列化为 XML?

java - 如何围绕 JPanel 缩放 JFrame?

css - 从 CSS 在 JavaFX8 中添加光照效果

JavaFX 模态阶段在 MAC 上表现异常