JavaFX JavaFX - TreeView will nicht

W

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

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 ;) ).
 
W

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

sascha-sphw

Bekanntes Mitglied
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(...);
 
W

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

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

sascha-sphw

Bekanntes Mitglied
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.
 
W

White_Fox

Top Contributor
Ja, da haste nicht unrecht. Gerade beim lesbaren Code stimme ich dir voll zu. Aber diesen Teil werde ich in den nächsten Tagen sowieso nochmal überarbeiten...
 
dzim

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
H JavaFX JavaFX - Scene Builder - BorderPane AWT, Swing, JavaFX & SWT 23
D Columns unabhängig voneinander mit Daten füllen JavaFx AWT, Swing, JavaFX & SWT 1
C JavaFX Installation unter IntelliJ IDEA AWT, Swing, JavaFX & SWT 5
J JavaFX Label aktualisieren AWT, Swing, JavaFX & SWT 18
H JavaFX JavaFX Import Fehler AWT, Swing, JavaFX & SWT 4
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
T Szene wechselen JavaFX mit If in Main Class AWT, Swing, JavaFX & SWT 2
S JavaFx Zufallsfarbe beim Button-Klick AWT, Swing, JavaFX & SWT 22
M JavaFX JavaFX in mehrere Controller AWT, Swing, JavaFX & SWT 21
R javafx erste application AWT, Swing, JavaFX & SWT 12
kneitzel JavaFX - Binding & Co AWT, Swing, JavaFX & SWT 41
S Alternative JavaFX TableView AWT, Swing, JavaFX & SWT 1
B Game of Life in JavaFX AWT, Swing, JavaFX & SWT 5
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
N JavaFX Chioceboxen verküpfen AWT, Swing, JavaFX & SWT 0
J JavaFX Controls AWT, Swing, JavaFX & SWT 4
S JavaFx AWT, Swing, JavaFX & SWT 2
Tashtego JavaFX + Mobile AWT, Swing, JavaFX & SWT 9
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
L JavaFX Javafx Dependency-Inversion AWT, Swing, JavaFX & SWT 19
OSchriever JavaFX auf Raspberry Pi 4 AWT, Swing, JavaFX & SWT 3
M JavaFX Tab auswählen mit JavaFX AWT, Swing, JavaFX & SWT 9
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
M Java und JavaFX 13 läuft endlich AWT, Swing, JavaFX & SWT 4
N JavaFX Logging des JavaFX Application Threads mit Log4J AWT, Swing, JavaFX & SWT 3
L Java FX JavaFX Effect Attribute ausdrucken AWT, Swing, JavaFX & SWT 1
Hatsi09 JavaFx Mediaplayer seltsames Verhalten AWT, Swing, JavaFX & SWT 0
Tashtego JavaFX - Datenübergabe zwischen Scenes AWT, Swing, JavaFX & SWT 8
Zrebna JavaFX-Projekt mit Bildern funktioniert nicht - um Hilfe wird gebeten AWT, Swing, JavaFX & SWT 14
S Kann javafx.scene.layout.VBoxBuilder nicht importieren AWT, Swing, JavaFX & SWT 3
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
S Jogl und JavaFX AWT, Swing, JavaFX & SWT 6
Bluedaishi JavaFX ProgressBar AWT, Swing, JavaFX & SWT 10
S JavaFX JavaFX TableView scrollen färbt falsche Zeilen AWT, Swing, JavaFX & SWT 1
F JavaFX JavaFX Builden: JavaFX Runtime components are missing AWT, Swing, JavaFX & SWT 0
F JavaFX wirft zufällig Exceptions AWT, Swing, JavaFX & SWT 5
M JavaFX JAVAFX TreeItem mit Tooltip versehen AWT, Swing, JavaFX & SWT 4
techM JavaFX -> CSS AWT, Swing, JavaFX & SWT 5
J JavaFx TableView mit CheckBox AWT, Swing, JavaFX & SWT 4
J JavaFX Stoppuhr mit javafx.timeline AWT, Swing, JavaFX & SWT 2
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
L JavaFX auf dem PI 4 installieren AWT, Swing, JavaFX & SWT 2
L JavaFX JavaFX Forms mit Groovy starten AWT, Swing, JavaFX & SWT 1
K JavaFX CSS Border (Verschiebung verhindern) AWT, Swing, JavaFX & SWT 4
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
M error: package javafx.scene.web is not visible import javafx.scene.web.*; AWT, Swing, JavaFX & SWT 16
J import javafx.fxml* bei JavaFX 13 geht nicht mehr AWT, Swing, JavaFX & SWT 7
F Kein JavaFX mehr im Eclipse Wizard AWT, Swing, JavaFX & SWT 1
N Ausführbare Datei aus JavaFX Projekt erstellen AWT, Swing, JavaFX & SWT 22
N Array mit JavaFX Elementen AWT, Swing, JavaFX & SWT 9
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
W JavaFX JavaFX - Spalten auf ganze SpreadsheetView verteilen AWT, Swing, JavaFX & SWT 16
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
S Erwaege JavaFX Einstieg AWT, Swing, JavaFX & SWT 27
O JavaFX mini Taschenrechner! AWT, Swing, JavaFX & SWT 35
L JavaFX JavaFX, FXML und Guice? AWT, Swing, JavaFX & SWT 0
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
L Javafx Controller Klasse in Maven AWT, Swing, JavaFX & SWT 7
L JavaFX JavaFX stürtzt durch einen Server#connect Exception AWT, Swing, JavaFX & SWT 3
Shallty JavaFX MenuItem (Info) Icon ändern AWT, Swing, JavaFX & SWT 7
E Aktuelle Uhrzeit auf jeder Stage anzeigen lassen (JavaFX) AWT, Swing, JavaFX & SWT 2
T JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
L JavaFX JavaScript im Javafx Webview AWT, Swing, JavaFX & SWT 4
pkm Ich kann JavaFX nicht installieren AWT, Swing, JavaFX & SWT 4
A JavaFX Daten in eine HTML-Table mit JS schreiben AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX Diagram Editor AWT, Swing, JavaFX & SWT 3
L JavaFX JavaFX Application mit Preloader sauber runterfahren AWT, Swing, JavaFX & SWT 10
K JavaFX funktioniert nicht AWT, Swing, JavaFX & SWT 2
G JavaFX Slider in JavaFX beide Seiten beschriften AWT, Swing, JavaFX & SWT 2
D JavaFX JavaFX Tutorial AWT, Swing, JavaFX & SWT 8
Bluedaishi JavaFX JFoenix TextField KeyEvent AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
H Feste Positionen und Größen in JavaFX AWT, Swing, JavaFX & SWT 1
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
B JavaFX JavaFX Table gespeichertes Wert auswählen/anvisieren AWT, Swing, JavaFX & SWT 3
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
J Javafx mediaplayer mit sftp AWT, Swing, JavaFX & SWT 0
platofan23 JAVAFX zweites Fenster öffnen AWT, Swing, JavaFX & SWT 2
MoxxiManagarm JavaFX Auch ich versuche mit JavaFX warm zu werden AWT, Swing, JavaFX & SWT 9
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
J JavaFX Wie verhindere ich das gleichzeitige Spielen von Dateien bei Mediaplayer JavaFX? AWT, Swing, JavaFX & SWT 3
H JavaFX - Label aktualisieren AWT, Swing, JavaFX & SWT 1
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
olfibits Swing JavaFX-Frame in JDesktopPane darstellen? AWT, Swing, JavaFX & SWT 2
A JavaFX Anwendung in Jar Datei AWT, Swing, JavaFX & SWT 8
C JavaFX & Obfuscator ProGuard AWT, Swing, JavaFX & SWT 23
N java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
C JavaFX CSS Unknown Property AWT, Swing, JavaFX & SWT 4
P JavaFX Fenster lädt nicht mehr AWT, Swing, JavaFX & SWT 4
I JavaFX Sehr viele Exceptions bei Taschenrechner mit JavaFx AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
J JavaFX von einem Array aus Buttons herausfinden auf welcher geklickt wurde aus dem Array. AWT, Swing, JavaFX & SWT 1
B JavaFX Grundlegende Verständnisfrage JavaFX<->Scene Builder AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Anzeige

Neue Themen


Oben