【问题标题】:How can I load a Local html file (not in my classpath) to WebView?如何将本地 html 文件(不在我的类路径中)加载到 WebView?
【发布时间】:2019-12-05 21:34:51
【问题描述】:

我正在学习 javafx 并正在创建一个 TodoList 应用程序。我想包含某些功能,如文本样式、使用项目符号列表等,为此我在我的应用程序中添加了一个 HTMLEditor,它存储 html 文件以供我的 WebView 加载。为了测试 html 文件的保存和加载,我保存了一个示例“test.html”文件(不在我的类路径中)并希望 WebView 加载它。 这是我的一些代码:

Main.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<?import javafx.scene.web.WebView?>
<GridPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="sample.Controller" hgap="10" vgap="10">
    <WebView GridPane.rowIndex="0" GridPane.columnIndex="0" fx:id="webView"/>
</GridPane>

Fxml Controller.java

public class Controller{

@FXML private WebView webView;
private WebEngine engine = webView.getEngine();

 @FXML
    public void initialize() throws IOException{
        //code for some ArrayList initialization

        engine.load("/home/jyotiproy/TodoOutput/test.html");

    }
}

加载程序的Main.java

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("Main.fxml"));
        primaryStage.setTitle("Todo List");
        primaryStage.setScene(new Scene(root, 1200, 600));
        primaryStage.show();
        primaryStage.setResizable(false);
    }


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

我没有收到任何错误或异常。 “test.html”的路径中没有错字,html 编辑器工作正常并保存了 test.html,但 WebView 什么也不加载。 这是我的应用程序结构:

【问题讨论】:

  • 阅读为File。将文件内容转换为String
  • String htmlString = new String (Files.readAllBytes(Paths.get(filePath)));
  • @Sedrick 使用了以下内容:`` File f = new File("/home/jyotiproy/TodoOutput/test.html"); engine.load(f.toString());``还是什么都没有
  • WebEngine#load(String) 方法需要String 形式的 URL。试试"file:///home/jyotiproy/TodoOutput/test.html" 之类的东西。如果您使用@Sedrick 建议的方法(即将文件的内容 读入String),那么您将需要使用WebEngine#loadContent(String)
  • 永远不要实例化打算由FXMLLoader 注入的字段。您引用的WebEngine 与您创建的WebView 相关联,而不是与FXMLLoader(即正在显示的那个)创建(和注入)的WebView 相关联。

标签: java javafx javafx-webengine javafx-webview


【解决方案1】:

感谢@Slaw 和@Sidrick,问题得到了解决。 原始代码中所需的更改是在代码的engine.load() 部分中添加了file://

工作代码

@FXML private WebView webView;



    @FXML
    public void initialize() throws IOException{
        //Some ArrayList Initialization 

        WebEngine engine = webView.getEngine();
        engine.load("file:///home/jyotiproy/Todolist/test2.html");
    }

截图:

【讨论】:

  • 它不完整 - 我无法将文件放入我的 IDE、编译并运行以重现您的问题。
  • 差不多。您描述的问题之一是代码运行时没有错误,但未能产生所需的结果。原因在您添加的代码图像中很明显(然后是correctly removed)。但是,您当前显示的代码(假设正常执行)将导致NullPointerException,因为您没有显示webView 字段的错误初始化。拥有基本的Application 类也很好。
  • 请注意,我也不是反对者,只是补充一下:请记住,minimal reproducible example 就是这样——问题的一个例子。我经常看到新用户的一件事是倾向于代码转储他们的整个项目(不是最小的)或简单地省略至少一半他们认为不相关的代码(不完整)。该示例应该是专门为堆栈溢出创建的,并包含最少 数量的代码来重现 问题。 minimal reproducible example 链接提供了一些关于如何隔离问题的有用提示,在此过程中甚至可以自行解决问题。
  • 现在看起来不错 :) 作为最后的挑剔:minimal 不应包含任何不相关的内容.. 例如关于不相关的省略行的代码 cmets,但这肯定是不重要
  • @kleopatra 明白了。下次我会记住这些事情的!谢谢! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 1970-01-01
  • 2014-01-19
  • 2014-02-28
  • 2019-04-08
相关资源
最近更新 更多