[英]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.