禁用在JavaFX中选择TableView中的某些TableRow项

时间:2016-07-04 22:29:22

标签: java javafx tableview tablerow

起点

我想实现一个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)受影响的行,但我仍然可以使用向下和向上箭头键选择/标记它们。

1 个答案:

答案 0 :(得分:2)

我尝试实现自定义选择模型和焦点模型,但最终使用了 hack(适用于我的用例)。在我的情况下,我一次最多只能跳过一行。因此,在 ChangeListenerselectedItemProperty 中,我最终使用了以下函数。

如果遇到项目行,我会触发回调,否则我会跳过类别行。

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()
  }
}