У меня есть столбец таблицы с полем со списком в качестве фабрики ячеек. Значение в этом поле со списком отображает нет. строк в таблице. Поэтому, когда я добавляю любую новую строку в таблицу, список, установленный в поле со списком, увеличивается, как показано.
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);
}
}
}
ComboBoxCellFactory
? Разве ты не можешь просто сделатьtbFileColSeq.setCellFactory(ComboBoxTableCell.forTableColumn(sequenceList));
? - person James_D   schedule 15.09.2015ComboBoxTableCell
и передадите емуObservableList
, этот наблюдаемый список будет использоваться всеми полями со списком, которые создает фабрика. Поэтому, если вы затем измените этот список, содержимое полей со списком изменится соответствующим образом. (Я только что проверил это.) В своем коде вы создаете новый список с помощьюFXCollections.observableArrayList(...)
и передаете его своей фабрике. Я не знаю, будет ли он вести себя так же, если вы передадите ему фактический список, который вы изменяете, потому что вы не показали код для своей фабрики, но именно так вы бы сделали это со стандартным классом. - person James_D   schedule 16.09.2015return new ComboBoxCellFactory<>(sequenceList);
- person James_D   schedule 16.09.2015