Как я могу загрузить локальный html-файл (не в моем пути к классам) в WebView?

Я изучаю 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.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 ничего не загружает. Вот структура моего приложения: WebView HTMLEditor


person jyoti proy    schedule 28.07.2019    source источник
comment
Читать как File. Преобразуйте содержимое файла в формат String.   -  person Sedrick    schedule 28.07.2019
comment
@Sedrick использовал следующее: `` File f = new File(/home/jyotiproy/TodoOutput/test.html); engine.load(f.toString());`` по-прежнему ничего   -  person jyoti proy    schedule 28.07.2019
comment
Это не то, как преобразовать содержимое файла в строку.   -  person Sedrick    schedule 28.07.2019
comment
Вы пытались System.out.println(f.toString()) понять, в чем проблема?   -  person Sedrick    schedule 28.07.2019
comment
вывод - это путь к файлу: /home/....../test.html   -  person jyoti proy    schedule 28.07.2019
comment
Это то, что должно быть. Используйте мой второй комментарий.   -  person Sedrick    schedule 28.07.2019
comment
@Sedrick Извините, если я ошибаюсь, но код из второго комментария преобразует все содержимое файла в строку, а затем с помощью метода .load мы передаем эту строку в WebEngine? Я так и сделал, но ничего не происходит :(   -  person jyoti proy    schedule 28.07.2019
comment
@Slaw Я использовал это engine.load("file:///home/jyotiproy/TodoOutput/test.html");, но все равно ничего не происходит. Теперь думаю, то ли я сделал что-то не так в объявлении FXML или не связал его с контроллером должным образом. Что-то не так с этим кодом?   -  person jyoti proy    schedule 28.07.2019
comment
@Slaw хороший улов на loadContent(String).   -  person Sedrick    schedule 28.07.2019
comment
Что ж, private WebEngine engine = webView.getEngine(); похоже, что он должен бросать NPE. Если это не так, то вы делаете что-то, что не отображается (т. е. ваш код не является минимально воспроизводимым примером).   -  person Slaw    schedule 28.07.2019
comment
@Slaw использовал .loadContent таким образом File f = new File("/home/jyotiproy/TodoOutput/test.html"); String htmlString = new String (Files.readAllBytes(Paths.get(f.toString()))); ``` engine.loadContent(htmlString);``` все равно ничего не происходит   -  person jyoti proy    schedule 28.07.2019
comment
@Slaw Я добавил полный код (касающийся WebView), пожалуйста, проверьте его.   -  person jyoti proy    schedule 28.07.2019
comment
Никогда не создавайте экземпляры полей, предназначенных для вставки FXMLLoader. WebEngine, на который у вас есть ссылка, связан с WebView, который вы создали, а не с WebView, который был создан (и введен) FXMLLoader (т. е. тот, который отображается).   -  person Slaw    schedule 28.07.2019
comment
@Slaw Большое спасибо. Я переписал код и на этот раз не создавал экземпляр WebView, а только WebEngine, и теперь он работает как надо!   -  person jyoti proy    schedule 28.07.2019


Ответы (1)


Благодаря @Slaw и @Sidrick вопрос был решен. Изменения, которые были необходимы в исходном коде, заключались в добавлении file:// в часть engine.load() кода.

Рабочий код

@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");
    }

Скриншот:

Рабочее приложение

person jyoti proy    schedule 28.07.2019
comment
это не форум, а база знаний, созданная сообществом :) Лично я согласен с объяснением отрицательного голоса (это не было моим, но могло быть потому, что вы не сделали все возможное - предоставьте минимальный воспроизводимый пример - чтобы ответить на вопрос, накапливать комментарии - не лучший способ, поэтому ваш код действительно далек от адекватного< /я>). Но это явно не обязательно (пожалуйста, прочитайте справочные страницы по голосованию). И при всем уважении: судя по вашей репутации, заявление типа не выполняет предназначение этого сайта довольно смело ;) - person kleopatra; 28.07.2019
comment
это не полное - я не могу закинуть файлы в свою IDE, скомпилировать и запустить, чтобы воспроизвести вашу проблему. - person kleopatra; 28.07.2019
comment
Почти. Одна из описанных вами проблем заключается в том, что код работает без ошибок, но не дает желаемых результатов. Причина была очевидна в изображениях вашего кода, которые вы добавили (а затем правильно удален). Однако код, который вы сейчас показываете (при нормальном выполнении), приведет к NullPointerException, потому что вы не показываете ошибочную инициализацию поля webView. Также было бы неплохо иметь базовый класс Application. - person Slaw; 28.07.2019
comment
Обратите внимание, что я также не был против, но просто добавил: имейте в виду, что минимально воспроизводимый пример — это просто — пример проблемы. Одна из вещей, которую я часто наблюдаю у новых пользователей, — это склонность выбрасывать весь проект (не минимальный) или просто опускать по крайней мере половину кода, который, по их мнению, считается неактуальным (неполным). Пример должен быть специально создан для Stack Overflow и содержать минимальный объем кода для воспроизведения проблемы. Ссылка минимально воспроизводимый пример содержит несколько полезных советов о том, как изолировать проблему, которая в процессе ее решения могут даже сами решить проблему. - person Slaw; 28.07.2019
comment
@Слав, спасибо за разъяснения. Код, который я не предоставил, относится к классу Main, который создает сцену для отображения webView и запускает программу. Это может быть достаточно сейчас. - person jyoti proy; 28.07.2019
comment
теперь выглядит хорошо :) В качестве последней придирки: минимум не должен содержать ничего, что не имеет отношения к делу .. например, комментарии кода о нерелевантных пропущенных строках, но это, конечно, не важно ‹g› - person kleopatra; 28.07.2019
comment
@kleopatra поняла. В следующий раз буду иметь в виду такие вещи! Спасибо! :) - person jyoti proy; 28.07.2019