如何更改应用于 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);
我有一个 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);