几分钟后 JavaFX JSObject 停止工作?
JavaFX JSObject stop working after a few minutes?
我正在制作一个基于 Web 的应用程序,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 不能再进行回调,如果我尝试在 "app" 对象上发出 alert() 它 return 我未定义。
我正在使用 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);
}
}
}
我正在制作一个基于 Web 的应用程序,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 不能再进行回调,如果我尝试在 "app" 对象上发出 alert() 它 return 我未定义。 我正在使用 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);
}
}
}