Javafx树表视图:如何将序列号分配给根节点

时间:2015-06-01 08:54:33

标签: javafx javafx-8

我试图以串行方式(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 ......

有人可以帮助我。

1 个答案:

答案 0 :(得分:0)

这是因为当调用用于评估每行值的CellValueFactorys方法时,无法控制。单行可能会多次调用,这就是为什么计数器没有为每一行显示正确的值。

这里首选动态方法。如果您只需要在3个节点级别(例如root / child / leaf)之间进行区分,那么您可以执行以下操作:

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的Children存储在ObservableList中,您可以只询问它们的索引并添加1,因为索引从零开始。