Как изменить список выбора поля со списком, примененный к ячейке таблицы

У меня есть столбец таблицы с полем со списком в качестве фабрики ячеек. Значение в этом поле со списком отображает нет. строк в таблице. Поэтому, когда я добавляю любую новую строку в таблицу, список, установленный в поле со списком, увеличивается, как показано.

ObservableList<Integer> sequenceList = FXCollections.observableArrayList();
sequenceList.add(1);
btnAdd.setOnAction((e) -> {
            sequenceList.add(counter);
            fileTable.getItems().add(new InstallationPack("enter file name", "--select--", "extensions", counter));
            counter++;
        });

здесь sequenceList — это список, применяемый к выпадающему списку.

Фабрика ячеек столбца таблицы показана

tbFileColSeq.setCellFactory(new Callback<TableColumn<InstallationPack, Integer>, TableCell<InstallationPack, Integer>>() {

            @Override
            public TableCell<InstallationPack, Integer> call(TableColumn<InstallationPack, Integer> param) {
                return new ComboBoxCellFactory<>(FXCollections.observableArrayList(seq));
            }

        });

Здесь ComboBoxCellFactory — это класс, применяющий поле со списком к столбцу таблицы как графику. Моя проблема в том, что фабрика ячеек столбца вызывается для всей его строки (будь то пустой или нет) в самом начале при объявлении. Таким образом, список, переданный в поле со списком ячеек таблицы, устарел. то есть оригинальный, а не последний. Поэтому, когда я добавляю новую строку, она показывает мне старый список.

Может ли кто-нибудь предложить в любом случае, в котором этот список со списком может быть обновлен?

РЕДАКТИРОВАТЬ: Ниже приведен код класса ComboBoxCellFactory.

import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;

public class ComboBoxCellFactory<S, T> extends TableCell<S, T> {

    private final ComboBox<T> comboBox;

    public ComboBoxCellFactory(ObservableList<T> items) {
        this.comboBox = new ComboBox<>(items);
        ComboBox cb = (ComboBox) getGraphic();
        comboBox.setId("comboBoxTableCell");
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);

        comboBox.setOnShown(new EventHandler<Event>() {

            @Override
            public void handle(Event event) {
                //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
                getTableView().edit(getIndex(), getTableColumn());
                getTableView().getSelectionModel().select(getIndex());

            }
        });

        comboBox.valueProperty().addListener(new ChangeListener<T>() {
            @Override
            public void changed(ObservableValue<? extends T> obs, T oldValue, T newValue) {

                commitEdit(newValue);
            }
        });

    }

    @Override
    public void cancelEdit() {

    }

    @Override
    public void updateItem(T item, boolean empty) {
        super.updateItem(item, empty);
        if (empty) {
            setGraphic(null);
        } else {
//                System.out.println(item);
            comboBox.setValue(item);
            setGraphic(comboBox);
        }
    }
}

person Harshita Sethi    schedule 15.09.2015    source источник
comment
Что такое ComboBoxCellFactory? Разве ты не можешь просто сделать tbFileColSeq.setCellFactory(ComboBoxTableCell.forTableColumn(sequenceList));?   -  person James_D    schedule 15.09.2015
comment
Как я уже упоминал, ComboBoxCellFactory — это отдельный класс, на который я ссылаюсь для применения представления со списком к столбцу. Делаю отдельный класс, чтобы моя таблица переходила в режим редактирования в 1 клик. Но это не проблема. Даже если я заменю свой код на тот, который вы упомянули, сначала будет вызываться cellFactory для всех строк. Таким образом, значение поля со списком в ячейке не будет обновляться.   -  person Harshita Sethi    schedule 16.09.2015
comment
Если вы используете стандартный ComboBoxTableCell и передадите ему ObservableList, этот наблюдаемый список будет использоваться всеми полями со списком, которые создает фабрика. Поэтому, если вы затем измените этот список, содержимое полей со списком изменится соответствующим образом. (Я только что проверил это.) В своем коде вы создаете новый список с помощью FXCollections.observableArrayList(...) и передаете его своей фабрике. Я не знаю, будет ли он вести себя так же, если вы передадите ему фактический список, который вы изменяете, потому что вы не показали код для своей фабрики, но именно так вы бы сделали это со стандартным классом.   -  person James_D    schedule 16.09.2015
comment
@James_D Ваше решение работает. Спасибо. Но я избегал этого, потому что при двойном щелчке он показывает мне поле со списком и переводит ячейку в режим редактирования. Поэтому я написал класс ComboBoxCellFactory для просмотра поля со списком без какого-либо щелчка и переводит ячейку в режим редактирования одним щелчком мыши. Можете ли вы предложить какие-либо изменения, которые я могу внести здесь, чтобы мой список comboxbox обновлялся с использованием моего метода. Я отредактировал свой вопрос и добавил код класса ComboBoxCellFactory.   -  person Harshita Sethi    schedule 16.09.2015
comment
Просто внесите такое же изменение. Передайте список, который вы фактически изменяете, вместо нового списка. т.е. return new ComboBoxCellFactory<>(sequenceList);   -  person James_D    schedule 16.09.2015


Ответы (1)


Вы создаете новый наблюдаемый список и передаете его своему ComboBoxCellFactory (который на самом деле является ячейкой, а не фабрикой ячеек):

return new ComboBoxCellFactory<>(FXCollections.observableArrayList(seq));

Поскольку FXCollections.observableArrayList(...) создает новый список, поля со списком не ссылаются на тот список, который вы изменяете. Поэтому им ничего не известно о каких-либо изменениях в этом списке.

Вместо этого передайте фактический список, в который вы вносите изменения. Например, если вы добавляете элементы в seq (что бы это ни было), вы должны сделать

return new ComboBoxCellFactory<>(seq);
person James_D    schedule 16.09.2015
comment
Он работает именно так, как я хочу... Большое спасибо. :) - person Harshita Sethi; 17.09.2015