Является ли 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);
}
}