我想实现一个TableView
,其中将检查每个TableRow
项的某个布尔值。如果此值为true,则将禁用此行以供选择。
例如,我有一个TableView
,其中包含3个TableRows
(每个Person
个对象)。现在我希望TableView使那些行对象属性不可选,其Person对象属性早于18岁。
假设 第二行 满足上述条件,因此无法选择。因此,如果我的光标当前集中在 第一行 并按下向下箭头键,则TableView将跳过任何不可选择的行(在这里: 第二行 )并选择下一个可用的可选行(此处为: 第三行 )
tblLineitems.setRowFactory(new Callback<TableView<Lineitem>, TableRow<Lineitem>>() {
public TableRow<Lineitem> call(TableView<Lineitem> tableview) {
return new TableRow<Lineitem>() {
@Override
protected void updateItem(Lineitem item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
} else {
itemProperty().addListener((ObservableValue<? extends Lineitem> observable, Lineitem oldValue, Lineitem newValue) -> {
if (newValue.isOlderThan18()) {
setDisable(true);
} else {
setDisable(false);
}
});
}
}
};
}
});
虽然我设法setDisable(true)
受影响的行,但我仍然可以使用向下和向上箭头键选择/标记它们。
答案 0 :(得分:2)
我尝试实现自定义选择模型和焦点模型,但最终使用了 hack(适用于我的用例)。在我的情况下,我一次最多只能跳过一行。因此,在 ChangeListener
的 selectedItemProperty
中,我最终使用了以下函数。
如果遇到项目行,我会触发回调,否则我会跳过类别行。
private fun MyListView.skipCategoryRow(
previousSelectionIndex: Int,
currentSelectionIndex: Int
) {
when {
currentSelectionIndex > previousSelectionIndex -> selectionModel.selectNext()
currentSelectionIndex > 1 -> selectionModel.selectPrevious()
/* prevent moving the selection to index 0, which is always a category row */
else -> selectionModel.selectNext()
}
}