JavaFX TreeTableView带有控件的自定义TreeCell

JavaFX TreeTableView带有控件的自定义TreeCell,java,javafx,treetableview,jfxtras,treecell,Java,Javafx,Treetableview,Jfxtras,Treecell,我是JavaFX8新手,在我的第二和第三篇专栏文章中尝试用一些jfxtras控件实现一个TreeTableView。因此,我使用定制TreeCells设置了这些柱的单元工厂,例如: col3.setCellFactory(新回调(){ @凌驾 公共TreeTableCell调用(TreeTableColumn参数){ TreeTableCell=新的TreeTableCell(){ 私有ColorPicker ColorPicker=新ColorPicker(); @凌驾 受保护的void up

我是JavaFX8新手,在我的第二和第三篇专栏文章中尝试用一些jfxtras控件实现一个TreeTableView。因此,我使用定制TreeCells设置了这些柱的单元工厂,例如:

col3.setCellFactory(新回调(){
@凌驾
公共TreeTableCell调用(TreeTableColumn参数){
TreeTableCell=新的TreeTableCell(){
私有ColorPicker ColorPicker=新ColorPicker();
@凌驾
受保护的void updateItem(字符串t,布尔bln){
超级更新项(t,bln);
设置图形(颜色选择器);
}
};
返回单元;
}
});
现在我可以看到ColorPicker并可以使用它们,但该列在扩展或折叠列1的节点(显示POJO中的字符串信息)时不会做出反应。例如,如果我折叠整棵树,第三列仍然显示所有的颜色选择器

那么,还需要什么来“同步”列呢


谢谢

当单元格显示的项目更改时,将调用
updateItem(…)
方法。如果单元格为空(例如,因为用户折叠了上面的单元格),则第二个参数将为
true
;您需要对此进行检查并取消设置图形

因此:

col3.setCellFactory(新回调(){
@凌驾
公共TreeTableCell调用(TreeTableColumn参数){
TreeTableCell=新的TreeTableCell(){
私有ColorPicker ColorPicker=新ColorPicker();
@凌驾
受保护的void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
if(空){
设置图形(空);
}否则{
设置图形(颜色选择器);
}                   
}
};
返回单元;
}
});

我不希望JFXtras控件为在表中呈现而实现一些特殊的功能。TreeViewTable应该负责隐藏或显示(其内容)单元格。实际上,我选择了错误的控件,因为我的post-ColorPicker不是来自jfxtras。但这是相同的,例如,使用LocalTimeTextField控件。你是说TreeTableView不能处理控件?或者还有什么我可以尝试的吗?它可以很好地处理这个问题:问题是你告诉所有的单元格(甚至是空的单元格)使用控件作为它的图形。仅当单元格非空时,才需要专门设置图形。看答案…好的,谢谢!这解决了空单元格的问题!但是,当我进行一些折叠/展开时,颜色选择器不会显示在正确的行中。
col3.setCellFactory(new Callback<TreeTableColumn<Object, String>, TreeTableCell<Object, String>>() {
        @Override
        public TreeTableCell<Object, String> call(TreeTableColumn<Object, String> param) {
            TreeTableCell<Object, String> cell = new TreeTableCell<Object, String>() {
                private ColorPicker colorPicker = new ColorPicker();
                @Override
                protected void updateItem(String item, boolean empty) {
                    super.updateItem(item, empty);  
                    if (empty) {
                        setGraphic(null);
                    } else {             
                        setGraphic(colorPicker);     
                    }                   
                }
            };
            return cell;
        }
    });