繁体   English   中英

JavaFX WebView HTML加载器未加载图像

[英]JavaFX WebView html loader not loading images

好吧,我有一个带有标签的html文件,该标签指向文件夹/ img /中的图像。 通过JavaFX窗口应用程序(不在html文件的同一路径中),我加载了html文件,但图像未加载。 这是我加载html文件的方式:

@FXML
WebView webView; // I get the webView through @FXML annotation

...
webView.getEngine().loadContent("path/to/file.html");

HTML文件结构:

path/to/file.html
path/to/img/image.png

以下是HTML内容:

<h1 style="color:red; font-style: italic">
    This is opencraft's presentation :)
</h1>
<img src="img/image.png">
<p>
    This is a simple description of how the game works, lol.
</p>

如果使用浏览器加载图像,则图像将被加载

有人可以帮助我吗?

我遇到了同样的问题,并通过在运行时修改映像中的src引用来解决了该问题。 当在IDE内部运行并且在JAR文件中运行应用程序时,此代码将起作用。 已在Ubuntu和Windows 10上使用1.8.0_121测试。

   Platform.runLater( () -> {
        WebView webView = new WebView();
        WebEngine webEngine = webView.getEngine();

        webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() {
            public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
                if (newState == Worker.State.SUCCEEDED) {
                     NodeList nodeList = doc.getElementsByTagName("img");
                    for (int i = 0; i < nodeList.getLength(); i++) {
                        HTMLImageElement n = (HTMLImageElement)nodeList.item(i);
                        String path = n.getSrc();
                        if( path.startsWith("file://")) {
                            path = path.substring(7,path.length());
                        } else if( path.startsWith("jar:")) {
                            path = path.substring(4,path.length());
                        }

                        URL m = YOURCLASS.class.getResource(path);
                        if( m != null ) {
                            n.setSrc(m.toExternalForm());
                        }
                    }
                }
            }
        });
        webEngine.load( url );
    }

在HTML内,您应该使用完整的资源路径指定图片。 如果您谨慎选择YOURCLASS,则可以使用相对路径。

基本上,问题是您需要一个完整的URL(包括方案等)才能使html中的相对链接正常工作。 相对于当前类或工作目录的URL将不起作用。

假设html文件和关联的图像与应用程序捆绑在一起(即,当为应用程序构建jar文件时,html文件和图像将成为jar文件的一部分),那么您可以使用以下方法检索html文件的URL:

getClass().getClassLoader().getResource("path/to/file.html");

路径相对于类路径的位置。 然后,您可以使用toExternalForm()转换为适当格式的String 这适用于html帮助页面等。

这是一个例子:

HTMLTest.java:

package htmltest;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class HTMLTest extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        WebView webView = new WebView();
        webView.getEngine().load(getClass().getClassLoader().getResource("htmltest/html/test.html").toExternalForm());
        Scene scene = new Scene(webView, 600, 600);
        primaryStage.setScene(scene);
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

test.html:

<html>
    <head><title>Test</title></head>
    <body>
        <h1>Test page</h1>
        <img src="img/testImage.png"/>
    </body>
</html>

testImage.png:

在此处输入图片说明

项目布局:

htmltest
  - HTMLTest.class
  - html
    - test.html
    - img
      - testImage.png

屏幕截图:

在此处输入图片说明

另一方面,如果您是从文件系统中真正加载HTML文件,则可以为HTML文件创建File对象,然后将其转换为URI。 例如,如果您正在编写一个HTML编辑器,其中用户编辑HTML文件并将其保存到文件系统中,并且您想要在Web视图中显示结果,则这将是适当的。 或者,如果您提示用户使用FileChooser加载HTML文件。

此代码如下所示:

File htmlFile = new File(...); // or get from filechooser...
webEngine.load(htmlFile.toURI().toString());

首先,您必须获取图像的本地路径作为字符串

String path = System.getProperty("user.dir");

然后,您必须在本地路径中将“ \\”标记替换为“ /”

path = path.replace("\\", "/");

然后,您可以使用system.out.print(path)打印路径,它将获得JavaFx项目的本地目录路径,例如D:/Projects/Java_Fx/My_Project
如果您的仿制文件位于“ img”之类的文件夹中,请使用path += "/img/";
然后,您的图像本地路径将为D:/Projects/Java_Fx/My_Project/img/

然后像这样加载html文件

webView.getEngine().loadContent("<!doctype html>  \n" +
                                "<html>          \n" +
                                "<head>     \n" +
                                "<meta charset='utf-8'>   \n" +
                                "<title>Your html</title>    \n" +
                                "</head>             \n" +

                                "<body>          \n" +
                                    "<h1 style='color:red; font-style: italic'>      \n" +
                                    "This is opencraft's presentation :)             \n" +
                                    "</h1>           \n" +
                                    "<img src='file:/"+path+"image.png'>         \n" +
                                    "<p>                 \n" +
                                    "   This is a simple description of how the game works.      \n" +
                                    "</p>        \n" +
                                "</body>             \n" +
                                "</html>"

我直接将html加载到引擎,并在image.png之前传递了“路径”,并在html代码中到处都使用了单引号,并将双引号用于字符串连接
<img src='file:/"+path+"image.png'>
如果要将图像插入为背景图像,可以使用
style='background-image: url(file:/"+path+"image.png);'

尝试使用硬链接链接到webView.getEngine().loadContent("path/to/file.html");中的html文件的位置webView.getEngine().loadContent("path/to/file.html");

像这样

String htmlFile = "file:///c:/full/path/to/file.html";
webView.getEngine().loadContent(htmlFile);

尽管当您要打包应用程序时,这可能会给您带来更多问题(如果html文件和资源将与该应用程序打包在一起),也有一些解决方法。 因此,更安全的是您的html文件和资源不与应用程序打包在一起。 我也会尝试更新此帖子以反映这一点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM