Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx树表视图:如何将序列号分配给根节点的直接子节点_Javafx_Javafx 8 - Fatal编程技术网

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

Javafx树表视图:如何将序列号分配给根节点的直接子节点,javafx,javafx-8,Javafx,Javafx 8,我正在尝试以串行方式对根节点的直接子节点进行编号(child-1、child-2…。 下面是我为myColumn设置单元格值工厂的方法: private void setCellValueFactory() { myColumn.setPrefWidth(120); final int[] si_SubsetCount = { 1 }; myColumn.setCellValueFactory( (TreeTableColumn.CellD

我正在尝试以串行方式对根节点的直接子节点进行编号(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);
    });
 }
我不明白为什么数字是4,8。。。而不是1,2


有人能帮我吗。

这是因为您无法控制何时调用CellValueFactory方法来计算每行的值。对于一行,它可能会被调用多次,这就是为什么您的计数器没有为每行显示正确的值

这里更倾向于采用动态方法。如果您只需要在根/子/叶这样的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 );
} );
myColumn.setCellValueFactory((最终CellDataFeatures p)->
{
最终TreeItem值=p.getValue();
字符串文本=”;
if(value.isLeaf())
text=“leaf”;
else if(value.getParent()!=null)
text=“Child-”+(value.getParent().getChildren().indexOf(value)+1);
其他的
text=“root”;
返回新的ReadOnlyStringWrapper(文本);
} );

由于树元素的子元素存储在ObservableList中,您可以要求他们输入索引并添加1,因为索引从零开始。

这正是我想要的。非常感谢:)就我的信息而言,CellValueFactory被多次调用背后有什么逻辑吗?我自己对实现不太熟悉。当我尝试创建新行和更改可见状态(展开/折叠)时,我注意到了这一点。总的来说,我对处理在屏幕上显示的值的方法有点熟悉,这可能来自于我的JavaSwing背景。在javafx中,机制是不同的,但我仍然尝试最小化这些方法中的开销。因此,对于您的用例,可能有比我更好的实现。这只是我想到的第一件事。
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 );
} );