Ячейка обновления JavaFX TableView, не обновляет значение объекта - PullRequest
0 голосов
/ 25 апреля 2018

После создания столбца, редактируемого как текстовое поле, и возможности редактировать и обновлять значение, показанное внутри ячейки, я заметил, что всякий раз, когда я пытался извлечь обновленное значение из табличного представления, только старое исходное неотредактированное значение возвращалосьme - Кажется, что значение, представленное внутри ячейки, не равно значению, возвращенному базовым объектом модели.

Чтобы сделать мой столбец редактируемым, я использую следующий код:

ObservableList<TableColumn> colums = search.getColumns();

colums.get(1).setEditable(true);
colums.get(1).setCellFactory(TextFieldTableCell.<DataPoint>forTableColumn());
colums.get(1).setCellValueFactory(new PropertyValueFactory<DataPoint, String>("No"));

Краткий фрагмент объекта DataPoint показан ниже

public class DataPoint {
    private ArrayList<String> data;

    /* Constructor not shown in example */

    // Get Number
    public String getNo() {
        return this.data.get(1);
    }

    public void setNo(String No) {
        this.data.set(1, No);
    }
}

. Для извлечения значения ячейки используется следующий код:

DataPoint selectedData = (DataPoint) TableView_Search.getSelectionModel().getSelectedItem();

System.out.println(selectedData.getNo());

Так как мне сохранить это обновленноезначение внутри объекта модели / как я могу извлечь показанное значение внутри ячейки?

(Мой графический интерфейс - это документ FXML, созданный с помощью программы Scene Builder из Gluon)

1 Ответ

0 голосов
/ 25 апреля 2018

Если cellValueFactory не возвращает свойство, которое также позволяет вам писать в элемент, вам нужно использовать событие onEditCommit для сохранения значения в элементе.PropertyValueFactory возвращает свойство, которое не записывает в элемент, если в классе элемента отсутствуют только метод получения и установки, но нет метода получения свойства.

((TableColumn<DataPoint, String>) colums.get(1)).setOnEditCommit(evt -> evt.getRowValue().setNo(evt.getNewValue()));

В качестве альтернативы вы можете использовать JavaBeanStringPropertyвозвращается из cellValueFactory для достижения этого эффекта:

JavaBeanStringPropertyBuilder builder = JavaBeanStringPropertyBuilder.create().beanClass(DataPoint.class).name("no");
colums.get(1).setCellValueFactory(cd -> builder.bean(cd.getValue()).build());   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...