Разрешить редактирование только для выбранной строки в таблице

Я новичок в 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);                                                          
                });
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
764
1

Ответы 1

Для этого может быть более элегантное решение, но вы можете просто установить редактируемый 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

Другие вопросы по теме