java.lang.Исключение UnsupportedOperationException при попытке удаления из @FXML TableView

#java #tableview

#java #просмотр таблицы

Вопрос:

Я не понимаю, почему этот метод не будет работать, потому что он работал буквально три дня назад. Всякий раз, когда я пытаюсь использовать метод (нажмите кнопку), операции с базой данных работают нормально, но программа выдает ошибку всякий раз, когда я пытаюсь удалить из фактического представления таблицы, чтобы пользователь больше не видел эту строку. Я добавил отфильтрованный список в метод инициализации, и я обеспокоен тем, что это может быть причиной проблемы. Вот мой код:

Метод инициализации:

     private void initialize()
    {
        ObservableList<BloomClient> clients = FXCollections.observableArrayList();
        firstNames.setCellValueFactory(new PropertyValueFactory<>("FirstName"));
        lastNames.setCellValueFactory(new PropertyValueFactory<>("LastName"));
        phoneNumbers.setCellValueFactory(new PropertyValueFactory<>("PhoneNumber"));
        birthdays.setCellValueFactory(new PropertyValueFactory<>("Birthday"));
        startDates.setCellValueFactory(new PropertyValueFactory<>("StartDate"));
        endDates.setCellValueFactory(new PropertyValueFactory<>("ExpireDate"));
        try {
            clients = dBconnect.getClientList();
        } catch (Exception e) {
            e.printStackTrace();
        }
        FilteredList<BloomClient> filteredList = new FilteredList<BloomClient>(clients,b -> true);
        filteredSearch.textProperty().addListener(((observable, oldValue, newValue) ->
                filteredList.setPredicate(person ->
                {
                    if(newValue == null || newValue.isEmpty())
                        return true;//nothing in text field
                    String lowerCaseFilter = newValue.toLowerCase();
                    if (person.getFirstName().toLowerCase().contains(lowerCaseFilter))
                        return true;//check first name
                    else if (person.getLastName().toLowerCase().contains(lowerCaseFilter))
                        return true;//check last name
                    else
                        return false;
                })
                ));
        SortedList<BloomClient> sortedList = new SortedList<>(filteredList);
        sortedList.comparatorProperty().bind(clientList.comparatorProperty());
        clientList.setItems(sortedList);
    }



public void freezeAccount() throws SQLException, ParseException {
        BloomClient person = clientList.getSelectionModel().getSelectedItem();
        dBconnect.sendToFreeze(person);//this works
        dBconnect.deleteClient(person);//this works
        clientList.getItems().remove(person);//java.lang.UnsupportedOperationException
        clientList.refresh();
    }
 

Ответ №1:

Ну, это всего лишь предположение. Но возможно, что clientList это List<> тип, который был создан с использованием Collections.unmodifiableList() . Когда вы пытаетесь изменить один из них, UnsupportedOperationException выдается ошибка.

общедоступный статический список неизменяемый список (список<? расширяет T> список)

Возвращает неизменяемый вид указанного списка. Этот метод позволяет модулям предоставлять пользователям доступ «только для чтения» к внутренним спискам. Операции запроса возвращаемого списка «считываются» до указанного списка и попытки изменить возвращаемый список, будь то напрямую или через его итератор, приводят к исключению UnsupportedOperationException.

Смотрите: https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#unmodifiableList-java.util .Список-

Комментарии:

1. Список клиентов — это TableView<Тип>

Ответ №2:

В некотором роде понял это, но хотел бы получить более глубокое объяснение. Я закончил вместо удаления из списка клиентов (TableView) Я удалил напрямую из клиентов (ObservableList) и сделал эту переменную глобальной для достижения другими методами. Я не уверен в причинах первоначальной проблемы.

         BloomClient person = clientList.getSelectionModel().getSelectedItem();
        dBconnect.deleteClient(person);
        clients.remove(person);
        clientList.refresh();
    }
 

Комментарии:

1. Рад, что вы разобрались. В любом случае это имеет больше смысла для работы с JavaFX. Обычно лучше всего настроить модель, наблюдаемую представлением. Вот почему я подумал clientList , что это список. 🙂