Является ли WebView "встраиваемым" в TextFlow?

В примерах OpenJDK для TextFlow говорится, что он может иметь произвольные узлы в качестве дочерних, например Button. Мне было интересно, если WebView может быть возможным ребенком? Если так, то я, должно быть, делаю что-то не так. Когда я добавляю его в TextFlow, WebView просто занимает место, но ничего не отображает. Контент, который я пробовал, варьируется от простых HTML -страниц до видео от таких сервисов, как YouTube.

Поскольку этот элемент управления является довольно новым, мне не удалось найти существующий вариант использования в Интернете.

На случай, если вам интересно, почему я этого хочу. У меня есть ListView, который отображает богатый контент. Если TextFlow способен отображать любой узел, то это избавит меня от создания нескольких классов расширений для разных типов, которые я хочу отобразить в ListView (например, видео, форматированный текст, HTML - это я уже сделал, и они отлично работают), и я могу легко управлять контентом, просто управляя детьми TextFlow.

Благодарю.

1 ответ

Решение

Да, ты можешь. Обратите внимание, что веб-представление будет размещено с использованием его baselineOffset, который не будет подходящим для использования в TextFlow (Я думаю, что произойдет, если его нижний край будет выровнен с нижним краем текста, и он обрезается до высоты строки текста.) Вы можете обойти это, обернув его в Group:

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.scene.web.WebView;
import javafx.stage.Stage;

public class WebViewInTextFlow extends Application {

    @Override
    public void start(Stage primaryStage) {
        TextFlow flow = new TextFlow();

        WebView webView = new WebView();
        webView.getEngine().getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> System.out.println(newState));
        webView.getEngine().load("http://stackru.com/questions/31353921/is-webview-embeddable-in-textflow/31357609#31357609");


        flow.getChildren().addAll(new Text("Some text"), new Group(webView), new Text("Some more text"));

        primaryStage.setScene(new Scene(flow, 800, 800));
        primaryStage.show();
    }

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

Другие вопросы по тегам