如何更改应用于 table 单元格的组合框选择列表

How to change combobox selection list applied to a table cell

我有一个 table 列,其中组合框作为其单元格工厂。此组合框中的值描述了编号。 table 中的行数。因此,当我向 table 添加任何新行时,组合框中的列表集会增加,如图所示。

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 是应用于组合框的列表。

table列单元格工厂如图

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 是一个 class 将组合框应用到 table 列作为图形。 我的问题是列的单元格工厂在声明时一开始就被调用了它的所有行(无论是否为空)。所以在 table 单元格组合框中传递的列表是旧的。即原始的而不是最新的。 因此,当我添加新行时,它会显示旧列表。

任何人都可以建议可以更新此组合框列表吗?

编辑:下面是 ComboBoxCellFactory 的代码 class

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

您正在创建一个新的可观察列表并将其传递给您的 ComboBoxCellFactory(这实际上是一个细胞,而不是细胞工厂):

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

因为 FXCollections.observableArrayList(...) 创建了一个 new 列表,组合框没有引用您正在修改的同一个列表。因此,他们不知道该列表有任何变化。

相反,传递要进行更改的实际列表。例如,假设您要向 seq 添加元素(无论那是什么),您会做

return new ComboBoxCellFactory<>(seq);