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

Javafx 如何更改应用于表格单元格的组合框选择列表,javafx,combobox,tablecolumn,Javafx,Combobox,Tablecolumn,我有一个表列,它的单元格工厂是combobox。此组合框中的值表示表中的行数。因此,当我向表中添加任何新行时,组合框中设置的列表将增加,如图所示 ObservableList<Integer> sequenceList = FXCollections.observableArrayList(); sequenceList.add(1); btnAdd.setOnAction((e) -> { sequenceList.add(counter);

我有一个表列,它的单元格工厂是combobox。此组合框中的值表示表中的行数。因此,当我向表中添加任何新行时,组合框中设置的列表将增加,如图所示

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++;
        });
observeListSequenceList=FXCollections.observearraylist();
增加(1);
btnAdd.setOnAction((e)->{
sequenceList.add(计数器);
添加(新安装包(“输入文件名”,“选择--”,“扩展名”,计数器));
计数器++;
});
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));
            }

        });
tbFileColSeq.setCellFactory(新回调(){
@凌驾
公共TableCell调用(TableColumn参数){
返回新的ComboBoxCellFactory(FXCollections.observableArrayList(seq));
}
});
这里ComboBoxCellFactory是一个将combobox作为图形应用于表列的类。 我的问题是,在声明时,列的所有行(无论是否为空)在开始时都会被调用。因此,表单元格组合框中传递的列表是旧的。i、 e原始版本,而不是最新版本。 因此,当我添加新行时,它会显示旧列表

有人能建议更新这个组合框列表吗

编辑:下面给出的是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);
        }
    }
}
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.collections.ObservableList;
导入javafx.event.event;
导入javafx.event.EventHandler;
导入javafx.scene.control.ComboBox;
导入javafx.scene.control.ContentDisplay;
导入javafx.scene.control.TableCell;
公共类ComboBoxCellFactory扩展了TableCell{
私有最终组合框组合框;
公共ComboxCellFactory(可观察列表项){
this.comboBox=新的组合框(项目);
ComboBox cb=(ComboBox)getGraphic();
setId(“comboBoxTableCell”);
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
setOnShown(新的EventHandler(){
@凌驾
公共无效句柄(事件){
//抛出新的UnsupportedOperationException(“尚未受支持”);//若要更改生成的方法体,请选择“工具”“模板”。
getTableView().edit(getIndex(),getTableColumn());
getTableView().getSelectionModel().select(getIndex());
}
});
comboBox.valueProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(observeValue您正在创建一个新的可观察列表,并将其传递给您的
ComboBoxCellFactory
(它实际上是一个单元格,而不是单元格工厂):


什么是
ComboBoxCellFactory
?您不能只执行
tbFileColSeq.setCellFactory(ComboxTableCell.forTableColumn(sequenceList))
?正如我已经提到的,ComboBoxCellFactory是一个单独的类,我正在为将combobox视图应用于列而重新提交。我正在创建一个单独的类,以便我的表在单击一次后进入编辑模式。但这不是问题所在,即使我用您提到的代码替换我的代码,所有行最初都会调用cellFactory。因此,单元格中的组合框值不会被刷新。如果使用标准的
ComboBoxTableCell
,并向其传递一个
ObservableList
,则工厂创建的所有组合框都将使用该可观察列表。因此,如果随后更改该列表,组合框的内容将相应更改。(我刚刚测试过这个。)在代码中,您使用
FXCollections.observableAryList(…)创建了一个新列表
并将其传递给您的工厂。如果您将要修改的实际列表传递给它,我不知道它是否会以相同的方式运行,因为您还没有显示工厂的代码,但这就是使用标准类的方式。@James\u D您的解决方案正在工作。谢谢。但我避免了这种情况,因为双击它会显示组合框所以我编写了ComboBoxCellFactory类来查看comboxbox,不需要任何点击,只需点击一次,就可以在编辑模式下获取单元格。你能建议我在这里做些什么更改,以便使用我的方法更新我的comboxbox列表吗?我已经编辑了我的问题,并添加了ComboxCellFactory类的代码。只需做一个简单的修改ame更改。传递您实际修改的列表,而不是新列表。例如,
返回新的ComboBoxCellFactory(sequenceList);
它完全按照我的要求工作……非常感谢。:)
return new ComboBoxCellFactory<>(FXCollections.observableArrayList(seq));
return new ComboBoxCellFactory<>(seq);