Привет всем, есть editable TableView, редактирование происходит двойным щелчком и сохраняется при нажатии Enter, можно ли сохранять значение не только через enter, а например, при щелчке на другую TableCell или в другую область, то есть при выходе TableCell из фокуса?
Да, это реализуемо. Суть в том, что вам необходимо проставить свою cell factory
, в которой необходимо реализовать данную логику. Код будет выглядеть примерно так:
TableColumn < TableBean, String > columnId = new TableColumn < > ("Id");
columnId.setCellValueFactory(new PropertyValueFactory < > ("id"));
columnId.setEditable(true);
columnId.setOnEditCommit(event -> {/*some logic here for save new value*/});
columnId.setCellFactory(e - > new TableCell < TableBean, String > () {
private TextField textField;
@Override
public void startEdit() {
super.startEdit();
if (this.textField == null) {
this.createTextField();
}
this.textField.setText(getString());
super.setGraphic(this.textField);
super.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Platform.runLater(this.textField::requestFocus);
}
@Override
public void cancelEdit() {
super.cancelEdit();
super.setText(String.valueOf(getItem()));
super.setContentDisplay(ContentDisplay.TEXT_ONLY);
}
@Override
protected void updateItem(String s, boolean b) {
super.updateItem(s, b);
if (b || s == null) {
super.setText(null);
super.setGraphic(null);
} else {
super.setText(this.getString());
super.setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
private String getString() {
return String.valueOf(super.getItem());
}
private void createTextField() {
this.textField = new TextField(getString());
this.textField.setMinWidth(super.getWidth() - super.getGraphicTextGap() * 2);
this.textField.setOnKeyPressed(t - > {
if (t.getCode() == KeyCode.ENTER || t.getCode() == KeyCode.TAB) {
super.commitEdit(textField.getText());
} else if (t.getCode() == KeyCode.ESCAPE) {
this.cancelEdit();
}
});
this.textField.focusedProperty().addListener((observable, oldValue, newValue) - > {
if (!newValue && textField != null) {
super.commitEdit(textField.getText());
}
});
}
});
Обратите внимание на метод createTextField()
: в нем создается текстовое поле и вешается обработчик focusedProperty()
- при покидания поля будет вызывать метод editCommit()
с новым значением.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Суть в чем сегодня нужно сдать проект, back-end на java запускается у меня на локальном (apache tomcat через idea) сервере и доступен из браузера следующим...
У меня есть 1 Activity я хочу передать данные в Presenter 2 Activity использую MVP
есть Сервлет такой, суть его работы : удалить, добавить, редактировать пользователей на JSP страницеЕго необходимо переделать, чтобы в методах...
Есть класс который подтягивает конфигурации изproperties файла в методе initPaths() отмеченным @PostConstruct