Столбец JavaFX TreeTableView setOnEditCommit () отказывается принимать обработчик для сохранения отредактированной ячейки

В моем проекте я использую TreeTableView из JavaFX для отображения некоторых объектов типа BillingTableRow. Я реализовал редактор ячеек, но когда я пытаюсь установить событие onEditCommit, мне не удается сопоставить типы содержимого.

Вот мой код для одного из столбцов, хранящих имена типа String внутри объекта типа BillingTableRow:

    // Name column
    Callback<TreeTableColumn<BillingTableRow, String>, TreeTableCell<BillingTableRow, String>> nameCallback = new Callback<TreeTableColumn<BillingTableRow, String>, TreeTableCell<BillingTableRow, String>>() {
        @Override
        public TreeTableCell<BillingTableRow, String> call(TreeTableColumn<BillingTableRow, String> p) {
            return new TextFieldTreeTableCell<BillingTableRow, String>();
        }
    };
    nameColumn.setCellFactory(nameCallback);
    nameColumn.setOnEditCommit(new EventHandler<CellEditEvent<BillingTableRow, String>>() {
        @Override
        public void handle(CellEditEvent<BillingTableRow, String> t) {
            ((BillingTableRow) t.getTableView().getItems().get(t.getTablePosition().getRow())).setName(t.getNewValue());
        }
    });

Может кто-нибудь подскажет, что не так? Я получаю следующую ошибку в Eclipse:

Метод setOnEditCommit (EventHandler ‹TreeTableColumn.CellEditEvent>) в типе TreeTableColumn не применим для аргументов (новый EventHandler‹ TableColumn.CellEditEvent ‹BillingTableRow, String >> () {})

Я ценю любую помощь с моей проблемой.


person Peter Jonsson    schedule 19.10.2014    source источник


Ответы (1)


Это потому, что у вас есть импорт

import javafx.scene.control.TableColumn.CellEditEvent;

Итак, когда вы определяете

EventHandler<CellEditEvent<BillingTableRow, String>>

компилятор получает это CellEditEvent как TableColumn.CellEditEvent, а не TreeTableColumn.CellEditEvent, и выдает ошибку.

Чтобы исправить это, удалите этот импорт и напишите expilcitly

EventHandler<TreeTableColumn.CellEditEvent<BillingTableRow, String>>
person Uluk Biy    schedule 19.10.2014
comment
Это работает, спасибо. Моя единственная проблема сейчас в том, что я не знаю, как получить объект данных для текущей строки и вызвать метод setName (), передав t.getNewValue () в качестве нового параметра имени. - person Peter Jonsson; 20.10.2014
comment
@uluik нет, он срабатывает, но я не могу получить базовый объект данных строки. Я хочу получить его, чтобы вызвать на нем метод setName (). Понятия не имею, как это сделать. Он отлично работал, когда я использовал таблицу, но с TreeTableView все кажется более сложным. - person Peter Jonsson; 20.10.2014
comment
@Uluik. Да ладно, я решил это. Оказывается, на самом деле это было довольно просто. Следующий код извлекает BillingTableRow: BillingTableRow row = t.getTreeTablePosition().getTreeItem().getValue();. Думаю, я слишком устал, чтобы понять это вчера. Спасибо вам за помощь. - person Peter Jonsson; 20.10.2014