2016-11-15 4 views
0

Ich habe Klasse myClass extends TreeItem<file> als Datamodel in einem TreeTableView verwendet werden, meist nach dem Beispiel hier: https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/TreeItem.html.JavaFX: Wie trigger TreeItem Ereignis

public class myTreeItem extends TreeItem<File> 
    private boolean isLeaf; 
    private boolean isFirstTimeChildren = true; 
    private boolean isFirstTimeLeaf = true; 

    @Override public ObservableList<TreeItem<File>> getChildren() { 
      // ... full code see link to Oracle documentation 
     return super.getChildren(); 
     } 

     private ObservableList<TreeItem<File>> buildChildren(TreeItem<File> TreeItem) { 
      // ... full code see link to Oracle documentation 
     }; 
} 

Ich habe eine Funktion hinzugefügt, um Kinder zu diesem Artikel hinzuzufügen. Ich habe Probleme mit der korrekten Aktualisierung des TreeTableView. Weitere Details finden Sie in den folgenden Code und Kommentare:

public void addChild(String name) { 
    itemManger.addChild(this.getValue(), name); // Generate Child 
    isFirstTimeChildren = true;  // Ensure that buildChildren() is called, when getchildren() is called. 

// getChildren();     // If I would activate this line, 
             // all listeners would be notified 
             // and the TreeTableView is updated. 
             // This is most likely due to the call super.getChildren(); 

    // However I want to throw the event on my own in order 
    // to avoid the extra call of this.getChildren(). Here is my 
    // (not sufficent) try: 
    EventType<TreeItem.TreeModificationEvent<MLDCostumizableItem>> eventType = TreeItem.treeNotificationEvent(); 
    TreeModificationEvent<MLDCostumizableItem> event = new TreeModificationEvent<>(eventType,this); 
    Event.fireEvent(this, event); 


    // Here I don't know how to get a value for target. 
    // Is there some standard target, which includes all FX components? 

} 

Wie das Ereignis richtig werfen?

+0

Ob Sie sofort nach der Liste aktualisieren oder ein Ereignis auslösen, das die Liste bewirkt, aktualisiert werden soll, um den gleichen Effekt und die Leistung des früheren Ansatzes haben wäre besser, also warum nicht nennen 'getChildren()' um eine Aktualisierung zu verursachen? Wenn Sie keine unnötigen Aktualisierungen wünschen, prüfen Sie einfach, ob alle Vorfahren erweitert sind ... – fabian

+0

Ich möchte auch ein tieferes Verständnis für FX-Trigger bekommen. Daher meine Frage. – BerndGit

+1

Ich verstehe nicht wirklich, was Sie hier versuchen, aber normalerweise denke ich, dass Sie ein 'TreeItem.TreeModificationEvent' mit einem geeigneten Konstruktor erstellen und dann ein' TreeItem' als Ziel in 'Event.fire (...) '. –

Antwort

0

Scheint, dass ich ein Missverständnis hatte, wie die Auslösung in JavaFX funktioniert. Nun ist die einfachste Lösung ist:

@Override // Taken from Link 
public void update(Observable observ, Object arg1) { 
    if (observ!=this.item) 
    { 
     LOGGER.error(new MLDConnectionException("Unexpected call of update() with observ = " + observ.toString())); 
     return; 
    } 
    // Build new Chidren list 
    try { 
     super.getChildren().removeIf((x) -> true); // empty list 
     super.getChildren().setAll(buildChildren(this)); 
    } catch (MLDConnectionException e) { 
     LOGGER.error("Error when genereting children List: ", e); 
    } 

} 

public File addChild(String name) throws MLDException { 

    File newChild = itemManger.addChild(item, name); 
    update(this.item, null); 
    return newChild; 
} 
Verwandte Themen