Ich hab die Lösung. Falls es jemanden interessiert, anbei die Lösung.
Für Verbessrungsvorschläge bin ich offen. Falls jemand einen besseren Algorithums kennt, bitte posten.
(Übersichtshalber habe ich die Klasse "Category" als innere Klasse definiert.)
[code=Java]package app;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import java.util.*;
public class TreeViewExample extends Application
{
private TreeItem<String> rootItem = new TreeItem<String>("Inbox");
private Map<Integer, TreeItem> map = new HashMap<>();
private List<Integer> tmpList = new ArrayList<>();
private List<Category> db = new ArrayList<>();
public static void main(String[] args) {
launch(args);
}
class Category
{
private int id;
private String title;
private int parent_id;
Category(int id, String title, int parent_id) {
this.id = id;
this.title = title;
this.parent_id = parent_id;
}
public int getId() {
return id;
}
public String getTitle() {
return title;
}
public int getParent_id() {
return parent_id;
}
}
@Override
public void start(Stage primaryStage) {
db.add(new Category(1, "private", 0));
db.add(new Category(2, "work", 0));
db.add(new Category(3, "email accounts", 1));
db.add(new Category(4, "gmail", 3));
db.add(new Category(5, "data gmail", 4));
db.add(new Category(6, "twitter account", 1));
db.add(new Category(10, "customer contacts", 2));
Iterator<Category> iterator = db.iterator();
while (iterator.hasNext()) {
Category currentCategory = iterator.next();
if (currentCategory.getParent_id() == 0) {
tmpList.add(currentCategory.getId()); // add id to tmpList
map.put(currentCategory.getId(), new TreeItem<String>(currentCategory.getTitle()));
iterator.remove(); // remove added Categories from db;
}
}
// add first TreeItems to rootItem:
for (TreeItem t : map.values()) {
rootItem.getChildren().add(t);
}
createNestedTree();
TreeView<String> tree = new TreeView<String>(rootItem);
StackPane root = new StackPane();
root.getChildren().add(tree);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
private void createNestedTree() {
Iterator<Category> iterator = db.iterator();
while (iterator.hasNext()) {
Category c = iterator.next();
int parentId = c.getParent_id();
if (tmpList.contains(parentId)) {
TreeItem<String> parentTree = map.get(parentId);
TreeItem<String> newChildTree = new TreeItem<>(c.getTitle());
parentTree.getChildren().add(newChildTree);
map.put(c.getId(), newChildTree);
tmpList.add(c.getId()); // add id to tmpList
iterator.remove(); // remove added Categories from db;
}
}
if (db.size() > 0) {
createNestedTree();
}
}
}[/code]