Javafx树表视图:如何分配序列号到根节点的直接子节点



我试图以串行方式为根节点的直接子节点编号(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开始。

最新更新