【问题标题】:How to get javafx WebView to load resources from a jar file如何让 javafx WebView 从 jar 文件中加载资源
【发布时间】:2020-06-02 20:57:53
【问题描述】:

我正在尝试获取 javafx.scene.web.WebView 以从 jar 文件中加载资源,但它不想这样做,并且不会产生任何有意义的错误。

jar 文件是一个 OSGi 包,特别是 cytoscape 应用程序(插件)包。

这是我的代码:(如果我将https://google.com 作为网址,一切正常)。

webView.getEngine().getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>() {
    @Override
    public void changed(ObservableValue<? extends Throwable> ov, Throwable t, Throwable t1) {
        System.out.println("Received exception: "+t1.getMessage() + " " + t1.getClass().getName());
        t1.printStackTrace();
    }
});

webView.getEngine().getLoadWorker().messageProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> ov, String t, String t1) {
        System.out.println("message:" + t1);
    }
});

String url = getClass().getResource("/foo.html").toExternalForm();
webView.getEngine().load(url);
System.out.println("contents:" + new String(getClass().getResourceAsStream("/foo.html").readAllBytes()));   

打印出来的:

message:Loading bundle://202.0:1/foo.html                                                                                                                                        
contents:<p>hello, webview</p>
message:Loading failed
Received exception: Unknown error java.lang.Throwable
    at javafx.web/javafx.scene.web.WebEngine$LoadWorker.describeError(WebEngine.java:1431)
    at javafx.web/javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1370)
    at javafx.web/javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1231)
    at javafx.web/com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2514)
    at javafx.web/com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2359)
    at javafx.web/com.sun.webkit.Timer.twkFireTimerEvent(Native Method)
    at javafx.web/com.sun.webkit.Timer.fireTimerEvent(Timer.java:83)
    at javafx.web/com.sun.webkit.Timer.notifyTick(Timer.java:64)
    at javafx.web/javafx.scene.web.WebEngine$PulseTimer.lambda$static$0(WebEngine.java:1192)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)

我怀疑问题是WebView 不知道这些bundle: URL。但我在WebEngine 中没有看到允许我实现新的 URL 方案的 api。

【问题讨论】:

  • 你能显示完整的堆栈跟踪(t1.printStackTrace())吗?也许还记录该网址?
  • 这很奇怪。请注意,由于您已经证明可以直接读取 URL 的内容,因此您可以通过String content = new String(getClass().getResourceAsStream("/foo.html").readAllBytes()); 和webView.getEngine().loadContent(content); 找到解决方法(虽然不知道 html 中的相对 url 会发生什么...)
  • @james_d,是的,但我希望接下来做 foo.css。我想我可以将所有内容打包成一个 HTML 作为解决方法
  • WebEngine 的 javadocs 声明 URL 处理是通过 java.net 包进行的,该包确实具有用于自定义内容处理程序的 API(但自从我看到它已经 15 年了,我没有不记得了)。我知道有使用 JavaFX 的 Cytoscape 插件,如果我没记错的话WebView 是这样做的原因之一,所以有人可能已经解决了这个问题。我会在 Cytoscape 论坛上留言,看看是否有人可以提供帮助。

标签: java javafx webview osgi cytoscape


【解决方案1】:

@james_d 是对的——问题是您从 getResource 获取的 URL 是一个 OSGi 包:uri,WebView 不知道如何阅读。您可以查看我们的 CyPlot 代码 (https://github.com/RBVI/CyPlot),了解我们如何解决该问题以读取 html 和 Javascript 并将其交给 Cytoscape 的网络浏览器。

-- 滑板车

【讨论】:

  • 那是正确的链接吗?看起来项目几乎是空的。
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 1970-01-01
  • 2014-06-21
  • 1970-01-01
  • 2011-08-01
  • 2014-10-11
  • 2014-09-10
  • 1970-01-01
相关资源
最近更新 更多