2

我扩展了 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?
    }
}

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

4

1 回答 1

3

至少有两种方法(不包括将值归零的技巧,如评论中所建议的那样)

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

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 的图形属性。

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

于 2015-06-22T13:22:55.833 回答