我有一个带有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);
}
}
}
答案 0 :(得分:1)
您正在创建一个新的可观察列表并将其传递给ComboBoxCellFactory
(实际上是一个单元格,而不是单元格工厂):
return new ComboBoxCellFactory<>(FXCollections.observableArrayList(seq));
由于FXCollections.observableArrayList(...)
创建新列表,因此组合框不会引用您正在修改的相同列表。因此,他们不知道该列表有任何更改。
相反,传递您要进行更改的实际列表。例如,假设您要向seq
添加元素(无论是什么),您可以
return new ComboBoxCellFactory<>(seq);