在JavaFX的TableView中禁用某些TableRow项的选择 起点
我想实现一个在JavaFX的TableView中禁用某些TableRow项的选择 起点,java,javafx,tableview,tablerow,Java,Javafx,Tableview,Tablerow,我想实现一个TableView,其中每个TableRow项都将被检查一个特定的布尔值。如果此值为true,则此行将被禁用以供选择 例如,我有一个TableView,其中有3个TableRows(每个都有一个Person对象)。现在,我想让TableView使那些Person对象属性超过18年的行不可选择。 假设第二行填充了上述条件,因此呈现为不可选择。因此,如果我的光标当前集中在第一行上,并且我按下向下箭头键,TableView将跳过任何不可选择的行(此处:第二行),并选择下一个可用的可选择行(
TableView
,其中每个TableRow
项都将被检查一个特定的布尔值。如果此值为true,则此行将被禁用以供选择
例如,我有一个TableView
,其中有3个TableRows
(每个都有一个Person
对象)。现在,我想让TableView使那些Person对象属性超过18年的行不可选择。
假设第二行填充了上述条件,因此呈现为不可选择。因此,如果我的光标当前集中在第一行上,并且我按下向下箭头键,TableView将跳过任何不可选择的行(此处:第二行),并选择下一个可用的可选择行(此处:第三行)
我的方法
tblLineitems.setRowFactory(新回调(){
公共TableRow调用(TableView TableView){
返回新的TableRow(){
@凌驾
受保护的void updateItem(Lineitem项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
}否则{
itemProperty().addListener((ObservalEvalue我尝试过实现一个自定义选择模型和一个焦点模型,但最终使用了一个hack(适用于我的用例)。在我的情况下,一次最多只能跳过一行。因此,在selectedItemProperty
的ChangeListener
中,我使用了以下函数
如果遇到项目行,我将触发回调,否则我将跳过类别行
private fun MyListView.skipCategorRow(
先前的选择索引:Int,
currentSelectionIndex:Int
) {
什么时候{
currentSelectionIndex>previousSelectionIndex->selectionModel.selectNext()
currentSelectionIndex>1->selectionModel.selectPrevious()
/*防止将所选内容移动到索引0,索引0始终是类别行*/
else->selectionModel.selectNext()
}
}
我认为最好的解决方案是实现您自己的SelectionModel
,但我不确定。过滤列表不是更简单吗?这将隐藏具有定义值的行,如“大家好,我想实现一个FilteredList,但我的客户坚持让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);
}
});
}
}
};
}
});