我扩展了TreeCell和TreeItem类。 MyTreeItem包含一个自定义属性,我在MyTreeCell内部使用它来呈现图形/字体等。问题是当我设置MyTreeCell.customProperty时,我不确定如何使TreeView / Cell重绘。

例如:

public class MyTreeItem extends TreeItem {
    Object customProperty

    public void setCustomProperty(Object customProperty) {
        this.customProperty = customProperty

        // how to fire a change event on the TreeView?
    }
}


对解决方案或(缺乏)设计方法的任何评论表示赞赏。

最佳答案

至少有两种方法(不包括注释中建议的使值无效的方法)

一种是在设置setCustomProperty中的自定义属性时手动触发TreeModificationEvent:

public class MyTreeItem extends TreeItem {
    Object customProperty

    public void setCustomProperty(Object customProperty) {
        this.customProperty = customProperty
        TreeModificationEvent<T> ev = new TreeModificationEvent<>(valueChangedEvent(), this);
        Event.fireEvent(this, ev);
    }
}


另一个是将自定义属性设置为“真实”属性,并让感兴趣的各方(例如您的自定义TreeCell)侦听该属性的更改。有关如何实现(和重新连线)的示例,侦听器查看DefaultTreeCell如何处理TreeItem的graphicProperty。

选择哪种方法取决于您的上下文:第一个确保通知所有TreeModificationEvents侦听器,第二个允许实现一个通用的TreeCell,并使用treeItem的属性(工厂)进行可视化。

10-04 18:13