如何让javafx WebView从jar文件中加载资源?

问题描述 投票:1回答:1

我想得到一个 javafx.scene.web.WebView 来加载jar文件中的资源,但它不想这么做,也没有产生任何有意义的错误。

这个jar文件是一个OSGi bundle,具体来说是一个叫做 细胞景观 应用(插件)捆绑。

这是我的代码。(如果我把 https://google.com 作为url)。)

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: URLs。 但我没有看到一个api在 WebEngine 这将使我能够实现一个新的URL方案。

java javafx webview osgi cytoscape
1个回答
0
投票

@james_d 是正确的 -- 问题是你从 getResource 得到的 URL 是一个 OSGi bundle: uri,WebView 不知道如何读取它。 你可以看看我们的CyPlot代码 (https:/github.comRBVICyPlot。),看看我们是如何解决这个问题的,以html和Javascript读取,并将其交给Cytoscape的网络浏览器。

-- 滑板车

© www.soinside.com 2019 - 2024. All rights reserved.