JavaFX Key-Value-Paar auf TreeItem ermitteln

Padde85

Mitglied
Hallo zusammen,

ich habe aktuell folgendes Problem. Ich baue mir aus der Dropbox einen Baum auf und lese immer nur die aktuelle Ebene. D.h. wenn ich den Baum initial aufbaue, habe ich nur die oberste Ebene. Erst wenn ich dann einen Folder aufklappe, wird für diesen Ordner dann der Inhalt nachgelesen.

Jetzt stellt sich mir die Frage, wie ich an den Schlüssel aus dem TreeItem wieder ran komme. Es gibt nur eine Methode getValue, die mir aber leider nur den im Baum angezeigten Text wiedergibt.

Mein Item baut sich aber aus dem Ordnerpfad als Schlüssel und dem Ordnernamen als angezeigter Text auf. Und den Pfad benötige ich, um dann der DropBox-API den Pfad, aus dem gelesen werden soll, mitgeben zu können.

Hat jemand eine Idee, wie ich an den Schlüssel komme, ohne eine von TreeItem abgeleitete Klasse erstellen zu müssen und mir den dann dort selbst abzuspeichern?
 

temi

Top Contributor
TreeItem ist doch eine generische Klasse. Du hast aktuell vermutlich ein TreeItem<String>.

Bau dir eine Klasse für deine Daten und steck die in ein TreeItem<Data>
Java:
// Einfaches Muster
class Data {
    public final String name;
    public final String path;
  
    public Data(final String name, final String path) {
        this.name = name;
        this.path = path;
    }

    // evtl. reicht es, wenn du toString() überschreibst, so dass der Text weiterhin korrekt angezeigt wird. Da bin ich jetzt nicht sicher.
    @Override
    public toString() {
        return name;
    }
}
 

Padde85

Mitglied
Hallo temi,

das habe ich schon. Ich habe eine Klasse dafür angelegt, die ich auch dem TreeItem als generischen Typ mitgebe. Dort speichere ich schon den Key und auch die Bezeichnung ab.

Ich habe die beiden Stellen Mal hier reingehängt.

Hier meine Klasse, die dem TreeItem mitgegeben wird:
Java:
public class DropBoxData {
    private String key;
    private String filename;
    
    public DropBoxData(String key, String filename) {
    this.filename = filename;
    this.key = key;
    }
    
    public String getKey() {
    return this.key;
    }
    
    public String getFilename() {
    return this.filename;
    }
    
    public void setKey(String key) {
    this.key = key;
    }
    
    public void setFilename(String filename) {
    this.filename = filename;
    }
    
    @Override
    public String toString() {
    return this.filename;
    }
}

Und hier der Part für das Erzeugen und Abfangen des Events:
Java:
 private void createFolderItem(TreeItem<DropBoxData> parent, String path, String name) {
    DropBoxData folderData = new DropBoxData(path, name);
    TreeItem<DropBoxData> currentNode = new TreeItem<DropBoxData>(folderData, images.getFolderImage());
    // Dummy-Leaf hinzufügen, damit expand-Event gefeuert werden kann
    DropBoxData dummyData = new DropBoxData(path+"0", "");
    TreeItem<DropBoxData> dummy = new TreeItem<DropBoxData>(dummyData);
    currentNode.getChildren().add(dummy);
    currentNode.addEventHandler(TreeItem.branchExpandedEvent(), new EventHandler<TreeItem.TreeModificationEvent<MouseEvent>>() {
        public void handle(TreeModificationEvent<MouseEvent> event) {
        eventFolderExpand(event);
        }
    });
    parent.getChildren().add(currentNode);
    }
    
    // Event-Handler
    // Beim Expandieren prüfen, ob Dummy-Knoten enthalten und Wenn Ja, entfernen und nächste Ebene hinzufügen
    private void eventFolderExpand(TreeModificationEvent<MouseEvent> event) {
    System.out.println(event.getSource());
    }
 

temi

Top Contributor
Dann verstehe ich das Problem nicht richtig, denn getValue() von TreeItem liefert dir doch in deinem Fall das Item als DropBoxData zurück. Darauf kannst du dann getKey() aufrufen.
 

temi

Top Contributor
Und noch wirklich ganz am Rande eine Anmerkung zu deiner DropBoxData Klasse. Es ist relativ sinnlos, die Instanzvariablen privat zu machen und dann Getter und Setter dafür anzubieten, dann kannst du sie gleich public machen. Eine Klasse sollte soviel wie möglich von sich verbergen und nur soviel wie unbedingt nötig öffentlich machen.

Ich bin ja ein großer Freund von immutablen Klassen, wenn es die Anwendung erlaubt, d.h. wenn die Klasse erzeugt wurde kann ihr Zustand nicht mehr geändert werden.
 

Padde85

Mitglied
Danke für deinen Hinweis, dass getValue das Objekt von TreeItem zurückliefert. Da habe ich den Wald vor lauter Bäumen nicht mehr gesehen.
Ich habe nun oben das MouseEvent durch DropBoxData ausgetauscht und dann natürlich auch die handle-Methode angepasst.

Nun bekomme ich auch kein MouseEvent-Objekt, sondern das tatsächliche Objekt zurück.

Vielen Dank für den Hinweis, manchmal braucht man einfach eine zweite Person, die einem sagt, dass man schon vor der Tür steht und nur noch eintreten muss :)

ZU den Settern und Gettern:
Die Setter entferne ich noch, ich hatte ursprünglich vorgehabt, über die Änderung des Textes im Baum auch direkt den Ordner in der Dropbox umzubenennen, daher hatte ich dann einfach alle Setter und Getter erzeugen lassen.
Ich bin immer ein Freund davon, sämtliche Variablen zu verstecken, sofern ich sie nicht explizit direkt ansprechen können muss, wie z.B. GUI-Elemente im Controller.

Aber auf jeden Fall danke ich dir für deine Hilfe :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
N JavaFX TreeItem: Value-Binding AWT, Swing, JavaFX & SWT 1
J CheckTreeView mit eigenem Cell Value AWT, Swing, JavaFX & SWT 3
P JavaFX Slider soll Value erst ab einer bestimmten Bedinung aendern AWT, Swing, JavaFX & SWT 19
U Swing Jtable cells value editable AWT, Swing, JavaFX & SWT 1
G Swing Value von einer JScrollBar auf eine andere übertragen AWT, Swing, JavaFX & SWT 2
A Swing Slider-Value auslesen und weitergeben AWT, Swing, JavaFX & SWT 4
T jSlider-Value als Float in jLabel ausgeben AWT, Swing, JavaFX & SWT 2
O Swing JSlider mit doppelter Value AWT, Swing, JavaFX & SWT 6
C Value eines RadioButtons ausgeben AWT, Swing, JavaFX & SWT 6
S SWT ProgressBar: Value/Selection anzeigen AWT, Swing, JavaFX & SWT 4
Semox Swing Slider mit Value Auswertung wird nicht angezeigt AWT, Swing, JavaFX & SWT 11
J Swing JXTable, vom CellRenderer gerendertes Value holen. AWT, Swing, JavaFX & SWT 5
G Value vom TreeCellEditor ist immer null AWT, Swing, JavaFX & SWT 3
O ScrollBar.setValue(int value); ? AWT, Swing, JavaFX & SWT 3
L Jcombobox + value Wert AWT, Swing, JavaFX & SWT 7
L JTable SelectRowByValue(Object Value)? AWT, Swing, JavaFX & SWT 3
L Button ändert eigenes Bild und Progressbar-Value nicht AWT, Swing, JavaFX & SWT 6
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
C Memory Karten nach Paar offen bleiben sonst wieder umdrehen AWT, Swing, JavaFX & SWT 1
K GUI, Button, ActionListener - ein paar Einsteigerprobleme AWT, Swing, JavaFX & SWT 1
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
D JPanel nach ein paar sekunden verändern AWT, Swing, JavaFX & SWT 5
I Ein paar SWT Fragen AWT, Swing, JavaFX & SWT 10
M Allgemeine Frage zur Methodik & ein paar spezielle Probl AWT, Swing, JavaFX & SWT 4
M JavaFX TreeView - TreeItem - SelectedItem AWT, Swing, JavaFX & SWT 7
M JavaFX JAVAFX TreeItem mit Tooltip versehen AWT, Swing, JavaFX & SWT 4
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
G JavaFX TreeItem AWT, Swing, JavaFX & SWT 3
Madlip Probleme mit TreeItem AWT, Swing, JavaFX & SWT 2
K SWT und Tree, wie kann ich TreeItem aus einem Tree entfernen? AWT, Swing, JavaFX & SWT 12
T [SWT] TreeItem als selektiert markieren AWT, Swing, JavaFX & SWT 2
G SWT - TreeItem mit Image AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben