Javafx树表视图:如何将序列号分配给根节点的直接子节点
我正在尝试以串行方式对根节点的直接子节点进行编号(child-1、child-2…。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
下面是我为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 );
} );