JavaFX Key-Value-Paar auf TreeItem ermitteln

Diskutiere Key-Value-Paar auf TreeItem ermitteln im AWT, Swing, JavaFX & SWT Bereich.
P

Padde85

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?
 
T

temi

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;
    }
}
 
P

Padde85

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());
    }
 
T

temi

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.
 
T

temi

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.
 
P

Padde85

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 :)
 
Thema: 

Key-Value-Paar auf TreeItem ermitteln

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben