Baumstrukturmodell -> Darstellung als TreeView

White_Fox

Top Contributor
Guten Morgen allerseits

Folgendes: Ich hab (schon vor einiger Zeit) eine Baumstruktur gebaut, die ein Modell ihrer selbst erzeugt. Dieses Modell besteht aus einer ArrayList mit ModelItems, die u.a. ihren Parent enthalten. So in etwa:

Java:
public class ItemModel{
    final ItemModel parent;
    final String name;
    
    public ItemModel getParent(){return parent;}
    
    public String getName(){return name;}
}

Als ich das geplant hab hatte ich schon eine Idee, wie ich daraus wieder eine Baumstruktur rekonstruieren kann. Dummerweise hab ich das mittlerweile wieder vergessen. Irgendwas mit rekursiven Methodenaufrufen, soviel weiß ich noch.
Jetzt möchte ich diesen Baum in einer TreeView darstellen.

Hat jemand eine pfiffige Idee, wie ich das bewerkstelligen kann?
 
Danke...aber so richtig hilft mir das leider nicht.

Ich will das tatsächlich als TreeView in JavaFX darstellen. Das Problem ist: wie ordne ich die Elemente an? Ich krieg das nicht in einen Algorithmus gegossen.
 
Hmm so sollte das eigentlich funktionieren. Oder hab ich dich etwa immer noch missverstanden?
Java:
public class Main extends Application {
    @Override
    public void start(Stage primaryStage) throws Exception {

        List<ItemModel> childElements = new ArrayList<>();

        ItemModel a3 = new ItemModel("A3", new ItemModel("A2", new ItemModel("A1", null)));
        ItemModel b2 = new ItemModel("B2", new ItemModel("B1", null));
        ItemModel c4 = new ItemModel("C4", new ItemModel("C3", new ItemModel("C2", new ItemModel("C1", null))));

        /*
         * A1
         * \-A2
         *   \-A3
         *
         * B1
         * \-B2
         *
         * C1
         * \-C2
         *   \-C3
         *     \-C4
         */

        childElements.addAll(Arrays.asList(a3, b2, c4));

        TreeItem<ItemModel> parentItem = createTreeFromChildElements(childElements);

        TreeView<ItemModel> tree = new TreeView<>(parentItem);
        tree.setShowRoot(false);

        primaryStage.setScene(new Scene(tree));
        primaryStage.show();

    }

    class ItemModel {
        String name;
        ItemModel parent;
        ItemModel(final String name, final ItemModel parent) {
            this.name = name;
            this.parent = parent;
        }

        @Override
        public String toString() {
            return name;
        }
    }

    private TreeItem<ItemModel> createTreeFromChildElements(final List<ItemModel> children) {
        final TreeItem<ItemModel> root = new TreeItem<>();
        children.stream().map(e -> createTreeFromChildElement(e, null)).forEach(root.getChildren()::add);
        return root;
    }

    private TreeItem<ItemModel> createTreeFromChildElement(final ItemModel item, final TreeItem<ItemModel> parentTreeItem) {
        if(parentTreeItem == null) {
            return createTreeFromChildElement(item.parent, new TreeItem<>(item));
        }
        TreeItem<ItemModel> node = new TreeItem<>(item);
        node.getChildren().add(parentTreeItem);

        if(item.parent != null) {
            return createTreeFromChildElement(item.parent, node);
        }
        return node;
    }
}
 
Hallo White_Fox, etwas ähnliches hatte ich heute morgen gemacht:
vielleicht kannst Du etwas damit anfangen, es wird bereitgestellt durch Jitpack (siehe Readme) und liegt nicht im Maven Central:
Java:
EasyDefaultMutableTreeNode<String> root = new EasyDefaultMutableTreeNode<String>("Root");
root.addChild("a").addChild("b").addChild("c");
root.getChildAt(1).addChild("g").addChild("h").addChild("x");
System.out.println(root.toString());
System.out.println(root.convertToDefaultMutableTreeNode().getChildAt(1).getChildAt(2).toString());


Es hat eine Konvertierungsmethode nach javax.swing.tree.TreeNode aber ich kann auch noch eine Konvertierungs nach javafx.scene.control.TreeItem hinzufügen...
 

Neue Themen


Zurück
Oben