Java 在自定义TreeItem属性更改时更新TreeView

Java 在自定义TreeItem属性更改时更新TreeView,java,javafx,javafx-8,groovyfx,Java,Javafx,Javafx 8,Groovyfx,我扩展了TreeCell和TreeItem类。MyTreeItem包含一个自定义属性,我在MyTreeCell中使用该属性来渲染图形/字体等。问题是,当我设置MyTreeCell.customProperty时,我不确定如何重新绘制树视图/单元格 例如: public class MyTreeItem extends TreeItem { Object customProperty public void setCustomProperty(Object customPrope

我扩展了TreeCell和TreeItem类。MyTreeItem包含一个自定义属性,我在MyTreeCell中使用该属性来渲染图形/字体等。问题是,当我设置MyTreeCell.customProperty时,我不确定如何重新绘制树视图/单元格

例如:

public class MyTreeItem extends TreeItem {
    Object customProperty

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

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

对解决方案或(缺乏)设计方法的任何意见都值得赞赏。

至少有两种方法(不包括意见中建议的将值置零的做法)

一种是在设置自定义属性时手动触发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);
    }
}
公共类MyTreeItem扩展了TreeItem{
对象自定义属性
public void setCustomProperty(对象customProperty){
this.customProperty=customProperty
TreeModificationEvent ev=新的TreeModificationEvent(valueChangedEvent(),此值);
事件。火灾事件(本次,ev);
}
}
另一种方法是将自定义属性设置为“不动产”,并让相关方(f.i.您的自定义TreeCell)听取该属性的更改。有关如何实现(和重新连接)侦听器的示例,请查看DefaultTreeCell如何处理TreeItem的graphicProperty


选择哪一个取决于您的上下文:第一个确保通知TreeModificationEvents的所有侦听器,第二个允许实现一个使用属性(factory)的常规TreeCell要可视化的树元素的属性。

您不能只使用默认的
treeItem
实现,并在此用例中使用其
value
属性吗?默认情况下,树单元将观察该属性,因此您不需要像这样进行任何附加连接。我有一些特殊项目,它们具有显示值,但与我的模型没有关联。我可以创建一个类来包装显示值和相关对象。尝试清除并重新设置valueProperty,它可能会触发updateItem,然后更新单元格渲染。触发事件解决了问题,但我同意James_D坚持使用值。