Я пытаюсь реализовать редактирование фиксации изменений фокуса отсюда http://docs.oracle.com/javafx/2/ui_controls/table-view.htm. И у меня есть следующее:JavaFX: обработчик TableView onEditCommit никогда не называется
class EditingCell extends TableCell<Object, String> {
private TextField textField;
public EditingCell() {
}
@Override
public void startEdit() {
System.out.println("START EDIT");
if (!isEmpty()) {
super.startEdit();
createTextField();
setText(null);
setGraphic(textField);
textField.selectAll();
}
}
@Override
public void cancelEdit() {
System.out.println("CANCEL EDIT");
super.cancelEdit();
setText((String) getItem());
setGraphic(null);
}
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
}
setText(null);
setGraphic(textField);
} else {
setText(getString());
setGraphic(null);
}
}
}
private void createTextField() {
textField = new TextField(getString());
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
textField.focusedProperty().addListener(new ChangeListener<Boolean>(){
@Override
public void changed(ObservableValue<? extends Boolean> arg0,
Boolean arg1, Boolean arg2) {
System.out.println("Test1");
if (!arg2) {
commitEdit(textField.getText());
}
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}
У меня есть POJO DTO, и поэтому я использую propertybuilder. И здесь я использую этот код:
Callback<TableColumn, TableCell> cellFactory =
new Callback<TableColumn, TableCell>() {
public TableCell call(TableColumn p) {
return new EditingCell();
}
};
....
TableColumn textColumn = new TableColumn<>("Text");
textColumn.setEditable(true);
textColumn.setCellFactory(cellFactory);
textColumn.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<Answer,String>, ObservableValue<String>>() {
@Override
public ObservableValue<String> call(TableColumn.CellDataFeatures<Answer, String> item) {
try {
return new JavaBeanStringPropertyBuilder().bean(item.getValue()).name("text").build();
} catch (NoSuchMethodException ex) {
Logger.getLogger(TaskDirItemController.class.getName()).log(Level.SEVERE, null, ex);
}
return null;
}
});
textColumn.setOnEditCommit(//THIS HANDLER IS NEVER CALLED
new EventHandler<CellEditEvent<Answer, String>>() {
@Override
public void handle(CellEditEvent<Answer, String> t) {
System.out.println("New Value:"+t.getNewValue());
Answer answer=(Answer)t.getTableView().getItems().get(t.getTablePosition().getRow());
}
}
);
В чем моя ошибка?
EDIT 1
я узнал, что обработчик вызывается только тогда, когда мы меняем фокус на любой другой компонент JavaFX КРОМЕ рядам в той же таблице. Как это исправить?
@Uluk Biy Не могли бы вы взглянуть? –
Это ошибка в JavaFX 8. В настоящее время нет легкого обходного пути. См. Http://stackoverflow.com/questions/29576577/tableview-doesnt-commit-values-on-focus-lost-event –
@Uluk Biy Спасибо! Как я уже сказал, Маэстро! –