Wie erwähnt here und here gibt es keinen einfachen Weg, die erforderliche Höhe einer Webansicht zu bestimmen, bis "RT-25005 Automatische bevorzugte Dimensionierung von WebView" implementiert ist.Korrekte Größe von in Tabelcell eingebettetem Webview
Gibt es Problemumgehungen für dieses Problem? Ich konnte keine Lösung in SO oder anderswo finden. Da dies jedoch kein ungewöhnliches Problem ist, muss es einen Workaround geben. Irgendeine Idee?
Für Webviews
eingebettet in einem stage
fand ich die folgende Lösung (siehe here):
webView.getEngine().executeScript(
"window.getComputedStyle(document.body, null).getPropertyValue('height')"
);
oder
Double.parseDouble(webView.getEngine().executeScript("document.height").toString())
Allerdings scheint dies nicht für Webviews in einem treecell eingebettet zu arbeiten, wie here. In diesem Fall bekomme ich immer zu große Zahlen.
Minimal Lauf Beispiel (einschließlich Empfehlung von jewelsea
):
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.application.Application;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import javafx.util.Callback;
import org.w3c.dom.Document;
public class TableViewSampleHTML extends Application {
private final ObservableList<MyData> data = FXCollections.observableArrayList(new MyData(1L), new MyData(3L), new MyData(2L), new MyData(4L), new MyData(1L));
public static void main(final String[] args) {
launch(args);
}
@Override
public void start(final Stage stage) {
final Scene scene = new Scene(new Group());
TableView<MyData> table = new TableView<>();
table.setPrefHeight(700);
final TableColumn<MyData, Long> nameCol = new TableColumn("So So");
nameCol.setMinWidth(200);
nameCol.setCellValueFactory(new PropertyValueFactory<>("i"));
// Allow to display Textflow in Column
nameCol.setCellFactory(new Callback<TableColumn<MyData, Long>, TableCell<MyData, Long>>() {
@Override
public TableCell<MyData, Long> call(TableColumn<MyData, Long> column) {
return new TableCell<MyData, Long>() {
@Override
protected void updateItem(Long item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setGraphic(null);
setStyle("");
} else {
WebView webview = new WebView();
webview.setPrefWidth(700.0);
WebEngine engine = webview.getEngine();
String textHTML = new String(new char[item.intValue()]).replace("\0", " <b> bold </b> normal, ");
// textHTML = "<body>"
// + textHTML + "</body>";
engine.loadContent(textHTML);
setGraphic(webview);
engine.documentProperty().addListener((obj, prev, newv) -> {
String heightText = engine.executeScript(
"window.getComputedStyle(document.body, null).getPropertyValue('height')"
).toString();
System.out.println("heighttext: " + heightText);
webview.setPrefHeight(Double.parseDouble(heightText.replace("px", "")));
this.setPrefHeight(Double.parseDouble(heightText.replace("px", "")));
setGraphic(webview);
});
}
}
};
}
});
table.setItems(data);
table.getColumns().addAll(nameCol);
((Group) scene.getRoot()).getChildren().addAll(table);
stage.setScene(scene);
stage.show();
}
public static class MyData {
private Long i;
public MyData(Long i) {
this.i = i;
}
public Long getI() {
return i;
}
}
}
Nun ist die outout ist
heighttext: 581px
heighttext: 581px
Allerdings sind diese Werte scheinen zu groß zu sein. Siehe screeenshot:
Vielen Dank für diesen Code. HTML-Body-Tag hat standardmäßig topmargin und leftmargins Sie müssen also topmargin = 0 leftmargin = 0 setzen, um Ränder zu entfernen. (
) So jetzt keine vertikale Bildlaufleiste müssen Sie hinzufügen Extra 10 hier: Doppelte Höhe = Double.parseDouble (heightText.replace ("px", "")) + 10.0; –