我试图以串行方式为根节点的直接子节点编号(child-1, child-2…)。
这是我的方法,设置单元格值工厂为myColumn:
private void setCellValueFactory() {
myColumn.setPrefWidth(120);
final int[] si_SubsetCount = {
1
};
myColumn.setCellValueFactory(
(TreeTableColumn.CellDataFeatures < MyDataClass, String > p) - > {
TreeItem < JVCC_PageHeaderInfo > ti_Row = p.getValue();
MyDataClass myDataClass = p.getValue().getValue();
String text;
if (ti_Row.isLeaf()) {
//leaf
} else if (ti_Row.getParent() != null) {
text = "Child-" + si_SubsetCount[0];
si_SubsetCount[0]++;
} else {
si_SubsetCount[0] = 1;
text = "Root";
}
return new ReadOnlyObjectWrapper < > (text);
});
}
但是我的输出如下:
>Root
>child-4
>leaf
>leaf
>child-8
>leaf
>leaf
我不明白为什么编号是4,8…而不是1,2…
有人能帮我一下吗
这是因为您无法控制何时调用CellValueFactorys方法来计算每行的值。它可能会被单行调用多次,这就是为什么您的计数器不会为每行显示正确的值。
这里首选动态方法。如果你只需要区分3个节点级别,比如根/子/叶,那么你可以这样做:
myColumn.setCellValueFactory( ( final CellDataFeatures<String, String> p ) ->
{
final TreeItem<String> value = p.getValue();
String text = "";
if ( value.isLeaf() )
text = "leaf";
else if ( value.getParent() != null )
text = "Child-" + (value.getParent().getChildren().indexOf( value ) + 1);
else
text = "root";
return new ReadOnlyStringWrapper( text );
} );
由于TreeItem的子元素存储在ObservableList中,你可以直接请求它们的索引并添加1,因为索引从0开始。