Взаимодействие с веб-просмотром, когда оно может быть загружено или не загруженоJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Взаимодействие с веб-просмотром, когда оно может быть загружено или не загружено

Сообщение Anonymous »

У меня есть класс 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»