Как ссылаться на данные ячеек в CellFactory? - PullRequest
0 голосов
/ 03 августа 2020

У меня есть TableView, где последний столбец - это столбец «Действие», содержащий настраиваемый объект ActionBox с кнопками для нескольких действий. Чтобы добавить поведение к этому ActionBox, мне нужно передать ему объект Data. Однако я не знаю, как ссылаться на объект.

class TableViewWithActionColumn() {
     @FXML TableColumn<Data, Void> actionColumn;

     public TableViewWithActionColumn() {
          // Code for loading custom component...
     }

     @FXML 
     public void initialize() {
          populateActionColumn();
     }

     private void populateActionColumn() {
        Callback<TableColumn<Data, Void>, TableCell<Data, Void>> cellFactory = new Callback<TableColumn<Data, Void>, TableCell<Data, Void>>() {
            @Override
            public TableCell<Data, Void> call(final TableColumn<Data, Void> param) {

                return new TableCell<Data, Void>() {
                    private final ActionBox actionBox = new ActionBox();

                    @Override
                    public void updateItem(Void item, boolean empty) {
                        super.updateItem(item, empty);

                        if (empty) {
                            setGraphic(null);
                        } else {
                            setGraphic(actionBox);
                        }
                    }
                };
            }
        };

        actionColumn.setCellFactory(cellFactory);
    }
}

Я предположил, что ссылка на объект находится в Void item, поэтому я попытался заменить все вхождения Void на Data , и делает setGraphic(new ActionBox(item));, но это привело к исключению NullPointerException, поэтому я полагаю, что это неправильный способ сделать это. Итак, как мне ссылаться на данные строки в контексте CellFactory?

1 Ответ

3 голосов
/ 03 августа 2020

TableCell имеет метод getTableRow(), который дает вам ссылку на TableRow, содержащий ячейку. TableRow сам по себе является реализацией ячейки, поэтому вы можете вызвать его метод getItem(), чтобы получить данные, представленные строкой.

В контексте (и удалив все ненужные шаблоны из вашего кода):

private void populateActionColumn() {
    actionColumn.setCellFactory(col -> new TableCell<Data, Void>() {
        private final ActionBox actionBox = new ActionBox();

        @Override
        public void updateItem(Void item, boolean empty) {
            super.updateItem(item, empty);

            if (empty) {
                setGraphic(null);
            } else {
                Data rowData = getTableRow().getItem();
                // ... something like: actionBox.setData(rowData) ; 
                setGraphic(actionBox);
            }
        }
    });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...