JavaFX JSObject几分钟后停止工作? [英] JavaFX JSObject stop working after a few minutes?

查看:183
本文介绍了JavaFX JSObject几分钟后停止工作?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm making a web based app with Java support for some particular requests (e.g. print without choosing the printer everytime) and there is something that id driving me crazy.

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

I use JavaFX for instantiate the browser object and everything works fine, but of course I need to make callbacks from JavaScript to Java, here is the code:

...
...
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

This works but after a few minutesthe bridge stoo working totally, javascript can't make callbacks anymore and if I try to make an alert() on the "app" object it return me undefined. I'm using JDK9

推荐答案

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

To make the solution more obvious: the approach suggested by @sillyfly works.

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

Instead of creating a new Bridge (or in my case Console) instance for every state change, make a single instance and reassign it every time. Something along the following lines.

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几分钟后停止工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆