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

时间:2015-09-15 08:13:15

标签: javafx combobox tablecolumn

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

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

1 个答案:

答案 0 :(得分:1)

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

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

由于FXCollections.observableArrayList(...)创建列表,因此组合框不会引用您正在修改的相同列表。因此,他们不知道该列表有任何更改。

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

return new ComboBoxCellFactory<>(seq);