Bug in TreeTableView rendering
Sverre Moe
sverre.moe at gmail.com
Mon Sep 30 10:08:40 UTC 2019
I have created an issue for this on GitHub.
https://github.com/javafxports/openjdk-jfx/issues/607
/Sverre
man. 26. aug. 2019 kl. 20:03 skrev Sverre Moe <sverre.moe at gmail.com>:
> I think I have found a bug/regression with Java 11 regarding TreeTableView.
> This has worked fine on JavaFX 8, but is messed up with JavaFX 11.
> 1) The arrow button is on the text
> 2) No text indentation levels: Each row (no matter the level) is at the
> left edge of the TreeTableView.
>
> I can file an issue at GitHub if this is a real bug/regression. I just
> wanted to check first here.
>
> TreeTableColumn<OurDataObject, Label> column = new
> TreeTableColumn<>("Column");
> column.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(new
> OurDataObjectLabel(param.getValue().getValue())));
>
> We are using Label here so we can set StyleClass based on some information
> in the OurDataObject.
>
> class OurDataObject {
> private String name;
> public String getName() { return name; }
> }
>
> class AlsoOurDataObject extends OurDataObject {
> public boolean isSomething() { ... }
> }
>
> class OurDataObjectLabel extends Label() {
> public OurDataObjectLabel(OurDataObject ourDataObject) {
> setText(ourDataObject.getName());
> if (ourDataObject instanceof AlsoOurDataObject) {
> if (((AlsoOurDataObject) ourDataObject).isSomething()) {
> getStyleClass().add("style");
> }
> }
> }
> }
>
> A workaround was to use OurDataObject for both types in the
> TreeTableColumn, create a CellFactory to do what has been done in
> OurDataObjectLabel and in addition to the CellValueFactory.
>
> Code Example for reproducing the problem:
> This is using a String instead of an Object as the data model for
> simplicity.
> I have attached a screenshot that illustrates this problem. Made with the
> example code below.
>
> import javafx.application.Application;
> import javafx.beans.property.ReadOnlyObjectWrapper;
> import javafx.scene.Scene;
> import javafx.scene.control.TreeItem;
> import javafx.scene.control.TreeTableColumn;
> import javafx.scene.control.TreeTableView;
> import javafx.scene.layout.StackPane;
> import javafx.scene.text.Text;
> import javafx.stage.Stage;
>
> public class App extends Application {
>
> public static void main(String[] args) {
> App.launch(args);
> }
>
> @Override
> public void start(Stage stage) throws Exception {
> StackPane root = new StackPane();
>
> TreeTableView<String> treeTableView = new TreeTableView<>();
> treeTableView.setShowRoot(false);
> root.getChildren().add(treeTableView);
>
> TreeTableColumn<String, Text> column = new
> TreeTableColumn<>("Column");
> column.setPrefWidth(200);
> treeTableView.getColumns().add(column);
>
> column.setCellValueFactory(param -> new ReadOnlyObjectWrapper<>(
> new Text(param.getValue().getValue())));
>
> TreeItem<String> rootItem = new TreeItem<>("");
> treeTableView.setRoot(rootItem);
>
> TreeItem<String> item1 = new TreeItem<>("LEVEL1");
> item1.setExpanded(true);
> rootItem.getChildren().add(item1);
>
> TreeItem<String> item2 = new TreeItem<>("LEVEL2");
> item2.setExpanded(true);
> item1.getChildren().add(item2);
>
> TreeItem<String> item3 = new TreeItem<>("LEVEL2_1");
> item3.setExpanded(true);
> item2.getChildren().add(item3);
>
> Scene scene = new Scene(root, 250, 150);
>
> stage.setTitle("JavaFX11");
> stage.setScene(scene);
> stage.show();
> }
> }
>
>
> /Sverre
>
>
More information about the openjfx-dev
mailing list