Я новичок в JavaFX. У меня есть таблица с несколькими столбцами и Edit button в каждой строке. Всякий раз, когда я нажимаю на Edit, первая ячейка выбирается для редактирования этой строки. Все идет нормально, но проблема в том, что всякий раз, когда я выбираю строку и нажимаю на ячейку, она также попадает в режим редактирования, хотя я не нажимал Edit. Я думаю, это потому, что я сделал tableView.setEditable(true), но я хочу разрешить редактирование только тогда, когда я нажимаю кнопку «Изменить», и только для этой строки, а не для других, когда я дважды щелкаю / одинарный щелчок. Я видел это, но они решили это с помощью всплывающего окна. Я не хочу этого.
В методе initialize() я пробовал этот способ, но он не совсем работает. Кто-нибудь может показать мне, как это правильно сделать, пожалуйста?
tableBuilding.setRowFactory(tv -> {
TableRow<ModelBrBuilding> row = new TableRow<>();
row.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
if (e.getButton() == MouseButton.SECONDARY) {
e.consume();
}
});
row.addEventFilter(MouseEvent.MOUSE_PRESSED,event -> {
if ( event.getButton() == MouseButton.PRIMARY && event.getClickCount() == 2 ) {
event.consume();
}
});
return row ;
});
и действие моей кнопки выглядит как
EditButton.setOnAction((ActionEvent event)->{
TableRow row = cell.getTableRow();
tableBuilding.requestFocus();
tableBuilding.getSelectionModel().select(row.getIndex());
int i=tableBuilding.getSelectionModel().getSelectedIndex();
tableBuilding.edit(i,colName);
});




Для этого может быть более элегантное решение, но вы можете просто установить редактируемый TableView прямо перед вызовом tableView.edit(int, TableColumn), а затем снова сделать его недоступным для редактирования, когда редактирование либо зафиксировано, либо отменено. Или вы можете сделать эту установку \ отключение редактируемой вещи на каждом конкретном TableColumn.
Например, в обработчике действий вашего Button:
button.setOnAction(evt -> {
evt.consume();
tableView.requestFocus();
tableView.edit(-1, null); // cancel any current edit if there is one
tableView.getSelectionModel().select(tableCell.getIndex());
tableView.setEditable(true);
tableView.edit(tableCell.getIndex(), tableColumn);
});
А затем для TableColumn:
EventHandler<TableColumn.CellEditEvent<S, T>> handler = evt -> tableView.setEditable(false);
tableColumn.setOnEditCancel(handler);
tableColumn.setOnEditCommit(handler);
// or you can use the addEventHandler(EventType, EventHandler) method