我扩展了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?
}
}
对解决方案或(缺乏)设计方法的任何评论都表示赞赏。
答案 0 :(得分:2)
至少有两种方法(不包括将值归零的黑客,如评论中所建议的那样)
一种是在设置自定义属性时手动触发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);
}
}
另一种方法是使自定义属性成为“真正的”属性,并让感兴趣的各方(f.i.您的自定义TreeCell)监听该属性的更改。有关如何实现(和重新连接)侦听器的示例,请查看DefaultTreeCell如何处理TreeItem的graphicProperty。
选择哪个取决于您的上下文:第一个确保通知TreeModificationEvents的所有侦听器,第二个允许实现一般TreeCell,使treeItem的属性(工厂)可视化。