Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.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的TableView中禁用某些TableRow项的选择 起点_Java_Javafx_Tableview_Tablerow - Fatal编程技术网

在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);
                        }
                    });
                }
            }
        };
    }
});