# TreeView cellFactory



## breakpoint (13. Mai 2016)

Ich mach gerade meine ersten Schritte mit der cellFactory von TreeView und ich frag mich, wieso die Items nicht mehr richtig ausgeblendet ("hide") werden, wenn man auf den Pfeil nebe dem Elternelement klickt... ich vermute, ich hab da was nicht richtig implementiert? 


```
package com.test;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class MainWindow extends Application {

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

    @Override
    public void start(Stage primaryStage) {
       
        StackPane root = new StackPane();
        Scene scene = new Scene(root, 300, 300);
       
        TreeView tree = new TreeView();
       
        tree.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {

            @Override
            public TreeCell<String> call(TreeView<String> arg0) {
                // TODO Auto-generated method stub
                TreeCell<String> cell = new TreeCell<String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        if(item != null) {
                            setGraphic(getTreeItem().getGraphic()); 
                            setText("Iten name");
                        }
                    }
                };
                return cell;
            }
        });

        TreeItem<String> rootItem = new TreeItem<String>("root");
        TreeItem<String> child = new TreeItem<String>("child");
        TreeItem<String> child2 = new TreeItem<String>("child of child");
       
        rootItem.getChildren().add(child);
        rootItem.setExpanded(true);
        child.getChildren().add(child2);
        child.setExpanded(true);
       
        tree.setRoot(rootItem);
       
        root.getChildren().add(tree);
       
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
```


----------



## knilch (14. Mai 2016)

Hi,
Du musst in der Implementation von updateItem noch eine Anpassung machen:

```
protected void updateItem(String item, boolean empty) {
    super.updateItem(item, empty);
    if (empty) {
        setText(null);
        setGraphic(null);
    }
    else {
        setGraphic(getTreeItem().getGraphic());
        setText("Iten name");
    }
}
```
Damit sollte es gehen.
Hier ist noch ein Link mit Beispielen: https://docs.oracle.com/javafx/2/ui_controls/tree-view.htm


----------



## breakpoint (14. Mai 2016)

Danke für deine Antwort. Wenn ich in meiner Implementation den Fall, dass empty == true ist, abdecke, geht gar nichts mehr. Es werden nicht einmal mehr die Pfeilsymbole gerendet. Funktioniert der Code bei dir?


----------



## knilch (14. Mai 2016)

Hi,
empty ist ein boolean. Du must keinen Vergleich: empty == true machen...
entweder:

```
if(empty)  {
// falls emty true ist, mach dies...
}
else {
// falls emty false ist, mach etwas anderes...
}
```
Das, was ich gepostet habe, funktioniert...
hier nochmals dein Code mit der Änderung von mir:

```
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Callback;

public class MainWindow extends Application {

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

    @Override
    public void start(Stage primaryStage) {
     
        StackPane root = new StackPane();
        Scene scene = new Scene(root, 300, 300);
     
        TreeView<String> tree = new TreeView<String>();
     
        tree.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {

            @Override
            public TreeCell<String> call(TreeView<String> arg0) {
                // TODO Auto-generated method stub
                TreeCell<String> cell = new TreeCell<String>() {
                    @Override
                    protected void updateItem(String item, boolean empty) {
                        super.updateItem(item, empty);
                        if (empty) {
                            setText(null);
                            setGraphic(null);
                        }
                        else {
                            setGraphic(getTreeItem().getGraphic());
                            setText("Item name");
                        }
                    }
                };
                return cell;
            }
        });

        TreeItem<String> rootItem = new TreeItem<String>("root");
        TreeItem<String> child = new TreeItem<String>("child");
        TreeItem<String> child2 = new TreeItem<String>("child of child");
     
        rootItem.getChildren().add(child);
        rootItem.setExpanded(true);
        child.getChildren().add(child2);
        child.setExpanded(true);
     
        tree.setRoot(rootItem);
     
        root.getChildren().add(tree);
     
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}
```

Poste doch mal deinen code


----------



## breakpoint (15. Mai 2016)

Hi, danke für den vollständigen Code. Ja, den Vergleich mit dem boolean-Wert habe ich schon richtig gemacht, es nur so im Text geschrieben. Ich mach später mal diff zwischen deinem und meinem Code, ich habe da sicherlich einen Vertipper wo drin. Danke dir nochmal.


----------

