Я не понимаю подробно, как у вас работает код.Я думаю, что это не работает, как задумано дизайном API.Я могу определенно ответить, если это возможно сделать с простым атрибутом FXML CheckBoxTableCell
: Нет.
В случае CheckBoxTableCell
... это не обязательно, чтоячейка переходит в состояние редактирования (...).Побочным эффектом этого является то, что обычные редактирующие обратные вызовы (например, при редактировании) будут вызываться , а не .Если вы хотите получать уведомления об изменениях, рекомендуется непосредственно наблюдать логические свойства, которыми манипулирует CheckBox.
, как указано в javadoc .
Если класс printedProperty
реализует ObservableValue<Boolean>
(как указано в вашем коде), вы должны следовать цитируемому документу и добавить к нему ChangeListener
, например
printedColumn.setCellValueFactory(f -> f.getValue().getPrintedProperty());
printedColumn.setCellFactory(CheckBoxTableCell.forTableColumn(new Callback<Integer, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(Integer param) {
ProductFx productFx = addProductModel.getProductFxObservableList().get(param);
return productFx.getPrintedProperty();
}
}));
ObservableList<ProductFx> obs = addProductModel.getProductFxObservableList();
obs.addListener(new ListChangeListener<ProductFx>(){
@Override
public void onChanged(Change<? extends ProductFx> c) {
if(c.wasAdded()) {
for (ProductFx s:c.getAddedSubList()) {
s.getPrintedProperty().addListener(new ChangeListener<Boolean>() {
ProductFx localProductFx=s;
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
updateInDatabase(localProductFx);
}
});
}
}
}
});
Но это не элегантно ввсе.
Ваш подход к решению проблемы:
Используемый вами Callback<Integer, ObservableValue<Boolean>>()
вызывается каждый раз, когда отображаемая ячейка обновляется.Это особенно актуально, когда вы прокручиваете огромный список, потому что TableView
сохраняет столько экземпляров Cell
, сколько необходимо для заполнения его порта просмотра ( doc ).Они просто обновляются во время прокрутки, и ваш код обновляет базу данных каждый раз, когда это происходит, так что вы можете столкнуться с проблемами производительности для больших наборов данных или медленных баз данных.
PS: Насколько я понимаю, ваш код не выполняется обычные правила именования для свойств.Это может привести к проблемам при использовании отражающих классов, таких как PropertyValueFactory
.