Taerus
Taerus

Reputation: 475

JavaFX TreeItem string not appearing

After hours of trying i finally somewhat managed to figure out how to hook a listener to TreeItems in a TreeView, it probably isn't at all the right way to do so but hey it works so far. Although one thing isn't, that is the "label" or better said text in the TreeItems isn't showing up anymore. enter image description here

Can anyone look at my code and tell me, if i'm either doing it completely wrong or why the text isn't showing up anymore? Thanks in advance.

Code:

TreeView<String> tree = new TreeView<>(); 

TreeItem<String> treeRoot = new TreeItem<>(Login.name + " - " + Login.accountType);
treeRoot.getChildren().addAll(new TreeItem<>("Branches"),
        new TreeItem<>("Planning"), new TreeItem<>("Courses"),
        new TreeItem<>("Add new item"));

treeRoot.getChildren().get(1).getChildren().addAll(
        new TreeItem<>("2014 - Q1"), new TreeItem<>("2014 - Q2"),
        new TreeItem<>("2014 - Q3"), new TreeItem<>("2014 - Q4"));
treeRoot.getChildren().get(3).getChildren().addAll(
        new TreeItem<>("Branch"), new TreeItem<>("Course"));

for(String str : loadBranchData()) {
    treeRoot.getChildren().get(0).getChildren().add(
        new TreeItem<>(str));
}
for(String str : loadCourseData()) {
    treeRoot.getChildren().get(2).getChildren().add(
        new TreeItem<>(str));
}
for(int c = 0; c <= 2; c++) {
    treeRoot.getChildren().get(c).setExpanded(true);
}

treeRoot.setExpanded(true);
tree.setPrefWidth(PREFWIDTH);
tree.setRoot(treeRoot);
tree.setShowRoot(true);
tree.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
    @Override
    public TreeCell<String> call(TreeView<String> p) {
        return new EpicTreeCell();
    }
});
...
    private final class EpicTreeCell extends TreeCell<String> {
        @SuppressWarnings("unchecked")
        super.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent evt) {
                System.out.println("TEST?");
            }
        });       
    }

Upvotes: 1

Views: 3279

Answers (1)

Uluk Biy
Uluk Biy

Reputation: 49195

When the custom cell is defined, the setText() method should be called in its overridden updateItem() method.

private final class EpicTreeCell extends TreeCell<String> {

    public EpicTreeCell() {
        setOnMouseClicked (
                new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent evt) {
                        System.out.println("TEST?");
                    }
                }
        );
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setText(null);
        } else {
            setText(getItem() == null ? "" : getItem().toString());
        }
        setGraphic(null);
    }
}

See the "Custom Java-fx cellfactory messes up the setCellValueFactory" for more information.

Upvotes: 4

Related Questions