JavaFX JavaFX - TreeView will nicht

White_Fox

Top Contributor
Guten Abend allerseits

Ich will eine TreeView erzeugenn, nur will das Ganze nicht so wie ich. Kann mir irgendwer sagen was ich da falsch mache?

Hier mal der Code:
Java:
public class LibraryBrowserPane extends Pane
        implements
        ModelObservable {

    private ViewdataControllable mainview;

    private VBox vbox;
    private StackPane tree;
    private TreeView<String> treeView;
    private HashMap<TreeItem<String>, LibraryTreeitemModel> treeitemMap;
    private TreeItem<String> rootItem;
    private LibrarybrowserContextmenu treeContextmenu;

    Address getSelectedLibrarypage() {
        TreeItem<String> selectedItem;

        selectedItem = treeView.getSelectionModel().getSelectedItem();
        if (selectedItem == null) {
            return treeitemMap.get(rootItem).getAddress();
        }
        else {
            return treeitemMap.get(selectedItem).getAddress();
        }
    }

    public LibraryBrowserPane(ViewdataControllable mainview) {
        this.mainview = mainview;

        initGUI();
    }

    private void initGUI() {
        vbox = new VBox();
        vbox.setSpacing(10);
        getChildren().setAll(vbox);

        tree = new StackPane();
        vbox.getChildren().add(tree);

        refreshTreeview();
    }

    private void refreshTreeview() {
        HashMap<LibraryTreeitemModel, TreeItem<String>> treemap;

        rootItem = new TreeItem<>();
      
        //Create treeView items for view and link them with the according model treeView item
        treemap = new HashMap<>();
        for(LibraryTreeitemModel modelItem : mainview.getTreemodelOfActiveLibrary()){
            TreeItem<String> viewItem = new TreeItem<>(modelItem.getName()); //modelItem.getName() liefert den String korrekt zurück, der angezeigt werden soll.
            treemap.put(modelItem, viewItem);
        }
      
        //Link parents and children
        for(LibraryTreeitemModel modelChild : mainview.getTreemodelOfActiveLibrary()){
            LibraryTreeitemModel modelParent;
            TreeItem viewChild;
            TreeItem viewParent;
      
            modelParent = (LibraryTreeitemModel) modelChild.getParent();
            viewChild = treemap.get(modelChild);
          
            viewParent = (modelParent == null) ? rootItem : treemap.get(modelChild.getParent());
            viewParent.getChildren().add(viewChild);
            viewParent.setExpanded(true);
        }
      
        treeView = new TreeView<>(rootItem);
        //tree = new StackPane();
        tree.getChildren().clear();
        tree.getChildren().add(treeView);
      
        treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
            LibraryTreeitemModel selectedItem() {
                return treeitemMap.get(treeView.getSelectionModel()
                        .getSelectedItem());
            }

            @Override
            public void changed(ObservableValue observable, Object oldValue, Object newValue) {
//                Address a = selectedItem().getAddress();
//                mainview.markAnotherLibraryitemAsActive(a);
            }
        });
      
        treeView.setContextMenu(treeContextmenu);
        treeView.setOnContextMenuRequested(treeContextmenu);
    }

    @Override
    public void notifyAboutChanges(ModelChange change) {
        switch (change) {
            case THE_ACTIVE_LIBRARY_HAS_CHANGED:
                refreshTreeview(); //Todo: change only item marking.
                break;
            case THE_LIBRARYTREE_HAS_CHANGED:
                refreshTreeview();
                break;
            default:
        }
    }

    @Override
    public ArrayList<ModelChange> needModelregistration() {
        ArrayList<ModelChange> list = new ArrayList<>();
        list.add(ModelChange.THE_ACTIVE_LIBRARY_HAS_CHANGED);
        list.add(ModelChange.THE_LIBRARYTREE_HAS_CHANGED);
        return list;
    }

    void setContextMenu(LibrarybrowserContextmenu contextmenu) {
        this.treeContextmenu = contextmenu;
        if (treeView != null) {
            treeView.setContextMenu(treeContextmenu);
            treeView.setOnContextMenuRequested(treeContextmenu);
        }
    }
}

Die TreeView an sich ist irgendwie da, aber es werden keine Strings angezeigt. Irgendwann habe ich das mal hinbekommen, aber jetzt geht es nicht mehr. Die Treelemente sollen einfach nur einen String enthalten, aber der String wird nicht angezeigt.

Sieht jemand, was da los ist? Die Methode refreshTreeview() wird korrekt aufgerufen, und die übergebenene modelItemobjekte enthalten auch die richtigen Daten (siehe Kommentar).


Edit: Typisch...kaum poste ich die Frage, hab ich den Fehler gefunden. Pfff....

Edit 2: Wer will kann dies ja als Rätsel sehen und den Fehler trotzdem suchen. Ich löse dann auf.
 
Zuletzt bearbeitet:

dzim

Top Contributor
Kann es sein, dass du einfach nur vergessen hast, die Items zu setzen? Das root Item setzt du beim initialisieren, aber sonst sehe ich nichts, was darauf hindeutet, dass du deine TreeItems auch tatsächlich an den TreeView gibst (du tust sie nur in die Tree-Map – ein Konstrukt, dass ich zugegebenermaßen etwas ungünstig finde, aber jedem das Seine ;) ).
 

White_Fox

Top Contributor
Die treemap ist eine HashMap...mit der ordne ich ModelItems (Objekte, die die anzuzeigenden Nutzdaten des Models enthalten) ein TreeItem zu.

Aber das war nicht der Fehler...
 

sascha-sphw

Top Contributor
Die treemap ist eine HashMap...mit der ordne ich ModelItems (Objekte, die die anzuzeigenden Nutzdaten des Models enthalten) ein TreeItem zu.
Warum machst Du nicht TreeItem<LibraryTreeitemModel> und überschreibst toString im Model? Das würde den Code schon mal etwas vereinfachen.

Aber wie @dzim kann ich im Code auch nicht finden, wo Du dem rootItem weitere Items hinzufügst.
Java:
rootItem.getChildren().add(...);
// oder
rootItem.getChildren().addAll(...);
 

White_Fox

Top Contributor
Ok, ich löse auf: Das Problem lag in der for-Schleife in Zeile 56. Da hätte ich über treemap iterieren müssen. Es sollte wie folgt laufen: Die modelItems liefern das modelItem ihres Parents zurück. Ich wollte je ein modelItem nehmen, dazu ein TreeItem erzeugen und dieses Pärchen in einer HashMap (das sollte die treemap sein) unterbringen.

In der for-Schleife wollte ich dann einmal an jedem modelItem vorbei, über dessen ParentmodelItem als Key auf das zugehörige ParentTreeItem zugreifen und damit jedem TreeItem einen Parent zuordnen.

Blöd: ich lasse mir in der for-Schleife eine neue Liste zum iterieren geben, und die enthält neue Modelobjekte. Die treemap-HashMap hat diese neuen Objekte natürlich nicht als Key, und liefert deswegen ständig null zurück und es kommt kein Baum zustande.

Das root Item setzt du beim initialisieren, aber sonst sehe ich nichts, was darauf hindeutet, dass du deine TreeItems auch tatsächlich an den TreeView gibst
Tja, gute Frage warum das da fehlt...anscheinend hab ich irgendwie den Code nicht vollständig kopiert. Hm...

Warum machst Du nicht TreeItem<LibraryTreeitemModel> und überschreibst toString im Model? Das würde den Code schon mal etwas vereinfachen.
Eigentlich wollte ich lieber eine innere Klasse haben die von TreeItem erbt, und in dieser ein ModelItem verwursten.
Dann hat es so erstmal funktioniert, dann wollte ich das auf die neue TreeItem-Klasse umstellen, und das ging schief. Jedenfalls habe ich es danach nicht mehr zum Laufen bekommen, dann die Geduld verloren, und anschließend in der History die lauffähige Version gesucht.

Die ModelItem-Objekte enthalten noch etwas mehr als nur den Namen eines Items (z.B. ein Address-Objekt, mit dem ein Item im Model gefunden werden kann, notwendig um Befehle auf einem Item ausführen zu können), und vorraussichtlich werden sie nach und nach immer mehr Informationen enthalten.
 

dzim

Top Contributor
Ah. Stimmt... Dann ergibt es auch wieder irgendwie Sinn, dass du nicht die Items setzt. Denn wenn du die Parents zuordnest, wird dadurch der Tree ja auch definiert (also wenn du dann am Ende x Elemente auch dem Root-Item zugeordnet hast).
 

sascha-sphw

Top Contributor
Ich selbst bin ja ein Fan von einfach lesbarem Code und würde das daher als Indikator für "zu komplexen Code" sehen, wenn bereits 2 Entwickler (und der Autor ebenfalls) nicht sofort erkennen konnten, was er eigentlich macht. Selbst wenn Du ihn aktuell verstehst, kann das in ein paar Monaten selbst für Dich eine Stelle sein, bei der Du Dir denkst, "was zum Teufel habe ich mir dabei gedacht" (Wer hatte diesen Augenblick noch nicht!?).

Nur mal so ein den Raum geschmissen.
 

dzim

Top Contributor
Ich selbst bin ja ein Fan von einfach lesbarem Code und würde das daher als Indikator für "zu komplexen Code" sehen, wenn bereits 2 Entwickler (und der Autor ebenfalls) nicht sofort erkennen konnten, was er eigentlich macht. Selbst wenn Du ihn aktuell verstehst, kann das in ein paar Monaten selbst für Dich eine Stelle sein, bei der Du Dir denkst, "was zum Teufel habe ich mir dabei gedacht" (Wer hatte diesen Augenblick noch nicht!?).

Nur mal so ein den Raum geschmissen.
Glaub mir: Das "OMG! Was habe ich mir dabei bloß gedacht!"-Gefühl, hab ich erst vor kurzen gehabt, als ich unsere Desktop-Speed-Test-App mit JavaFX erweitern musst/durfte. Das Erweitern (Kotlin, mit einer aus TornadoFX abgeleiteten UI-DSL) und die neuen UIs haben Spaß gemacht. Aber durch den alten Code wühlen und überhaupt zu verstehen, wie diese fast nur auf Events reagierende GUI nochmal das macht, was sie macht, war ein Krampf. Ich hab meinen Programmierstil wirklich deutlich verändert mit der Zeit...

Ein kompletter Refactor ist leider im Moment nicht drin im Budget. Aber ich hab schon mit nem Kollegen gesagt, dass es Zeit wird, eine neue Major-Version zu machen und das Tool von Grund auf neu zu schreiben.

Tja... Man lernt nie aus!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I JavaFX TreeView Pfeil nicht mehr Klickbar machen AWT, Swing, JavaFX & SWT 1
B JavaFx TreeView mit file system AWT, Swing, JavaFX & SWT 1
D JavaFX TreeView stylen AWT, Swing, JavaFX & SWT 6
D javafx.scene.control.TreeView als dropdown Menü AWT, Swing, JavaFX & SWT 6
Juelin StringGrid in SceneBuilder und javaFX AWT, Swing, JavaFX & SWT 2
Juelin starten maven javafx programm ohne netbeans AWT, Swing, JavaFX & SWT 38
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
MiMa JUnit5 im JavaFX Projekt AWT, Swing, JavaFX & SWT 2
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
MiMa Fonts, Icons, Bilder in JavaFX Anwendung AWT, Swing, JavaFX & SWT 5
MiMa SwingFXUtils in JavaFX 20 AWT, Swing, JavaFX & SWT 6
MiMa JavaFX Fenstertitel zu klein. AWT, Swing, JavaFX & SWT 1
MiMa JavaFX JAR unter Windows ausführen schlägt fehl? AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
Hatsi09 Javafx Neuladen von ImageView und MediaView AWT, Swing, JavaFX & SWT 3
Maxim6394 JavaFX Umlaute in JavaFX GUI AWT, Swing, JavaFX & SWT 12
Maxim6394 JavaFX Scene Builder - Crash bei eigener Komponente AWT, Swing, JavaFX & SWT 2
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
MartinNeuerlich Kann mir jemand, der einen Mac mit einem m1 oder m2-Chip hat, eine POM geben mit der Javafx-Fullscreen beim Mac mit m-Chip funktioniert? AWT, Swing, JavaFX & SWT 1
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
JavaSchmecktLecker JavaFX JavaFX Ordner automatisch verlinken AWT, Swing, JavaFX & SWT 2
melaniemueller Taschenrechner JavaFX AWT, Swing, JavaFX & SWT 4
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
thor_norsk JavaFX Anwendung stürzt ab AWT, Swing, JavaFX & SWT 4
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
berserkerdq2 Wie füge ich ein Bild in javafx mit dem Scenebuilder ein, das automatisch mitgezogen wird, wenn das Fenster vergrößert wird oder Vollbildmodus AWT, Swing, JavaFX & SWT 6
B Java Projekt mit JavaFX und jfoenix ausführbar machen AWT, Swing, JavaFX & SWT 46
H JavaFX wie JavaFX Projekt aufsetzen? AWT, Swing, JavaFX & SWT 10
thor_norsk JavaFX - Grafikkarte AWT, Swing, JavaFX & SWT 7
MiHimbert Rückmeldung an den aufrufenden JAVAFX-Dialog AWT, Swing, JavaFX & SWT 1
MiMa JavaFX Runtime components are Missing??? AWT, Swing, JavaFX & SWT 3
J JavaFx PDF in einem Element in einem Fenster anzeigen. AWT, Swing, JavaFX & SWT 11
B JavaFX Sprachumschaltung mit Button auf der HMI AWT, Swing, JavaFX & SWT 6
H JavaFX Fehlende JavaFX Package AWT, Swing, JavaFX & SWT 10
K JavaFX unterschiedliche (mehrere Fenster) in seperater Main Methode AWT, Swing, JavaFX & SWT 26
_user_q Kann man ein 2. JavaFX-Fenster auch beenden (exit) statt schließen (close) lassen? AWT, Swing, JavaFX & SWT 8
G JavaFX Line Chart mit Farbverlauf/Gradient in Linie AWT, Swing, JavaFX & SWT 1
thor_norsk JavaFX, FXML und SceneBuilder AWT, Swing, JavaFX & SWT 6
_user_q Über installDist exportiertes Programm wirft "Unsupported JavaFX configuration" AWT, Swing, JavaFX & SWT 0
CodingBerlin JavaFX Programm läuft nur unter Eclipse AWT, Swing, JavaFX & SWT 1
H Fehler: Zum Ausführen dieser Anwendung benötigte JavaFX-Runtime-Komponenten fehlen AWT, Swing, JavaFX & SWT 44
temi JavaFX "Frames" in JavaFx - passende Komponente? AWT, Swing, JavaFX & SWT 13
G JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor) AWT, Swing, JavaFX & SWT 9
_user_q [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
A JavaFX exportierte Jar ohne beim starten die Libs hinzufügen? AWT, Swing, JavaFX & SWT 2
J JavaFX Schiffe versenken mit JavaFX und Scene builder AWT, Swing, JavaFX & SWT 3
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
L JavaFx Textformatierung mittels Datenbank und Funktion anpassen AWT, Swing, JavaFX & SWT 5
sserio Wie funktioniert ein Controller bei JavaFx? AWT, Swing, JavaFX & SWT 1
sserio Kann man bei JavaFx ein Fenster aufkommen lassen? AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
K Bekomme (u.a) javafx.fxml.LoadException trotz "korrektem" Code AWT, Swing, JavaFX & SWT 8
S JavaFX: voneinander abhängige TextFields AWT, Swing, JavaFX & SWT 33
M Gluon will JavaFX in den Browser stecken AWT, Swing, JavaFX & SWT 0
H javafx application does not exist AWT, Swing, JavaFX & SWT 16
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
izoards JavaFX TableView mit Array Inhalt füllen AWT, Swing, JavaFX & SWT 1
M Javafx versuch Bibliothek zu erstellen AWT, Swing, JavaFX & SWT 0
N JavaFX Javafx intelij Projekt zu ausführbaren jar Datei Machen AWT, Swing, JavaFX & SWT 1
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
izoards JavaFX TextFlow - Sonderzeichen AWT, Swing, JavaFX & SWT 1
maximstein JavaFX WebView - java.lang.NoSuchMethodError: 'boolean com.sun.prism.ResourceFactory.isDisposed()' AWT, Swing, JavaFX & SWT 4
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
MiHimbert javaFX openfx (17) datepicker AWT, Swing, JavaFX & SWT 3
A Mit JavaFX einzelne Zeilen in TableView farbig markieren AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Taschenrechner mit SceneBuilder AWT, Swing, JavaFX & SWT 12
Jose05 Javafx Label Höhe=Breite AWT, Swing, JavaFX & SWT 1
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
izoards JavaFX editierbare Tabelle AWT, Swing, JavaFX & SWT 4
N javafx Position der Bustaben finden label AWT, Swing, JavaFX & SWT 1
D Verschieden Scenen ansprechen mit dem Scene Builder und JavaFX (Eclipse) AWT, Swing, JavaFX & SWT 16
izoards JavaFX Background Task warten auf Knopfdruck AWT, Swing, JavaFX & SWT 4
M Zufallsgenerator bei JavaFx AWT, Swing, JavaFX & SWT 1
N Label Schriftart Ändern javafx AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX, MVVM und SceneBuilder AWT, Swing, JavaFX & SWT 4
S JavaFx Album AWT, Swing, JavaFX & SWT 137
I JavaFX - Pane wechseln über 2. Controller AWT, Swing, JavaFX & SWT 5
melaniemueller JavaFX Beispiel kann nicht ausgeführt werden AWT, Swing, JavaFX & SWT 4
T FXML Datei in Java Code einbinden: javafx.fxml.LoadException AWT, Swing, JavaFX & SWT 2
J JavaFX - Included FXML - Entfernen feststellen AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX/ Taskmenu / UML Klassendiagramm AWT, Swing, JavaFX & SWT 2
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
2 JavaFX die ChoiceBox leitet den String nicht weiter oder es komm zu einem NullPointer AWT, Swing, JavaFX & SWT 8
C MouseEvent JavaFX AWT, Swing, JavaFX & SWT 4
L JavaFX javafx.fxml.LoadException bei einem Taschenrechner AWT, Swing, JavaFX & SWT 5
M4cM4rco0707 JavaFX Custom-Komponente mit Custom-Controller AWT, Swing, JavaFX & SWT 3
M Error occurred during initialization of boot layer java.lang.module.FindException: Module javafx.controls not found AWT, Swing, JavaFX & SWT 14
G javafx build.fxbuild in eclipse und ANT AWT, Swing, JavaFX & SWT 9
M Kollisionensbehandlung mit JavaFX AWT, Swing, JavaFX & SWT 1
N JavaFX - Toolkit not initialized AWT, Swing, JavaFX & SWT 6
G JavaFX , Duplicate erzeugt aber ich weis nicht wo AWT, Swing, JavaFX & SWT 4
K Javafx Plugin (javafx:jlink) mit moditect Plugin nutzen ... AWT, Swing, JavaFX & SWT 5
J Saubere Trennung Model, View, Controller Javafx AWT, Swing, JavaFX & SWT 10
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben