У меня есть класс Java, который загружает контент в WebView. Этот WebView содержит программу JavaScript, к которой мне нужно выполнить запрос, например, для заполнения списков компонентов графического интерфейса, вызова методов, возвращающих примитивы, и т. д.
Проблема для меня заключается в том, что WebViews могут быть только взаимодействует в потоке приложения JavaFX, а загрузка происходит в фоновом потоке. Это означает, что программа JS загружается примерно через 500 мс после инициализации моего класса, поэтому в течение этого периода мой класс недействителен, и любые вызовы методов, запрашивающие программу JS, будут возвращать какое-то исключение (например, потому что объект DOM еще не существует). ). Однако я не могу ждать, потому что это блокирует поток приложения JavaFX, и загрузка никогда не завершается.
Я хочу иметь возможность запрашивать программу JS таким образом, чтобы вызывать классы может получить информацию о будущем ответа, но любая попытка, которую я предпринял, приводит к тупиковой ситуации в потоке приложения JavaFX.
В случае, если это поможет продемонстрировать ответ, это минимальный пример аналогичного класса, который загружает текстовый редактор JS с CDN и запрашивает переменную, определенную после загрузки страницы.
В этом примере мне нужен способ для классов взаимодействие с объектами WithWebView, чтобы иметь возможность вызывать getX «безопасным» способом, чтобы они (в конечном итоге) получили ответ. Я понимаю, что для этого мне следует использовать CompletableFuture, но я почему-то не понимаю, как я могу дождаться завершения загрузки страницы и при этом вернуть значение в будущем. Единственный «безопасный» способ — показанный ниже, где я добавляю обратный вызов к stateProperty класса loadWorker WebEngine.
package com.example.demowebview;
import javafx.concurrent.Worker;
import javafx.scene.Parent;
import javafx.scene.web.WebView;
public class WithWebView {
private WebView webView;
WithWebView() {
webView = new WebView();
String content = """
x = "Answer"
""";
webView.getEngine().loadContent(content);
// System.out.println(getX()); // this will throw an exception, because loading takes some time
webView.getEngine().getLoadWorker().stateProperty().addListener((v, o, n) -> {
if (n == Worker.State.SUCCEEDED) {
System.out.println(webView.getEngine().executeScript("x")); // this will work because I'm waiting on the loadworker to finish
}
});
}
Parent getParent() {
return webView;
}
public String getX() {
return (String)webView.getEngine().executeScript("x");
}
}
с помощью простой оболочки приложения:
package com.example.demowebview;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class HelloApplication extends Application {
@Override
public void start(Stage stage) {
WithWebView wwv = new WithWebView();
Scene scene = new Scene(wwv.getParent(), 320, 240);
stage.setTitle("Hello!");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... -be-loaded
Взаимодействие с веб-просмотром, когда оно может быть загружено или не загружено ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Веб-просмотр Flutter игнорирует стек, и над самим веб-просмотром ничего не щелкается.
Anonymous » » в форуме Android - 0 Ответы
- 25 Просмотры
-
Последнее сообщение Anonymous
-