Is it possible to generate JavaFX TreeItem children dynamically based on a function?

Introduction:

I am currently working on my first TreeView in JavaFX.

The example provided in the documentation is as follows:

  TreeItem<String> root = new TreeItem<String>("Root Node"); root.setExpanded(true); root.getChildren().addAll( new TreeItem<String>("Item 1"), new TreeItem<String>("Item 2"), new TreeItem<String>("Item 3") ); TreeView<String> treeView = new TreeView<String>(root); 

In this example, we manually create the TreeItem tree structure, that is, we call getChildren() on each node that has children and adding them.

Question:

Is it possible to tell TreeItem โ€œdynamicallyโ€ build its children? It would be ideal if I could define the parent-child relationship as a function.

I would be looking for something like the following:

 // Function that generates the child tree items for a given tree item Function<TreeItem<MyData>, List<TreeItem<MyData>>> childFunction = parent -> { List<TreeItem<MyData>> children = new ArrayList<>( parent. // TreeItem<MyData> getValue(). // MyData getChildrenInMyData(). // List<MyData> stream(). map(myDataChild -> new TreeItem<MyData>(myDataChild)))); // List<TreeItem<MyData>> // The children should use the same child function children.stream().forEach(treeItem -> treeItem.setChildFunction(childFunction)); return children; }; TreeItem<MyData> root = new TreeItem<MyData>(myRootData); root.setExpanded(true); // THE IMPORTANT LINE: // Instead of setting the children via .getChildren().addAll(...) I would like to set a "child function" root.setChildFunction(childFunction); TreeView<MyData> treeView = new TreeView<String>(root); 
+5
source share
1 answer

Since there are no built-in functions for this (as indicated in the comments of @kleopatra), I came up with the following TreeItem implementation:

 public class AutomatedTreeItem<C, D> extends TreeItem<D> { public AutomatedTreeItem(C container, Function<C, D> dataFunction, Function<C, Collection<? extends C>> childFunction) { super(dataFunction.apply(container)); getChildren().addAll(childFunction.apply(container) .stream() .map(childContainer -> new AutomatedTreeItem<C, D>(childContainer, dataFunction, childFunction)) .collect(Collectors.toList())); } } 

Usage example:

 Function<MyData, MyData> dataFunction = c -> c; Function<MyData, Collection<? extends MyData>> childFunction = c -> c.getChildren(); treeTableView.setRoot(new AutomatedTreeItem<MyData, MyData>(myRootData, dataFunction, childFunction)); 

This will probably help someone in the future.

+2
source

Source: https://habr.com/ru/post/1270729/


All Articles