#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.
Комментарии:
1. Список клиентов — это TableView<Тип>
Ответ №2:
В некотором роде понял это, но хотел бы получить более глубокое объяснение. Я закончил вместо удаления из списка клиентов (TableView) Я удалил напрямую из клиентов (ObservableList) и сделал эту переменную глобальной для достижения другими методами. Я не уверен в причинах первоначальной проблемы.
BloomClient person = clientList.getSelectionModel().getSelectedItem();
dBconnect.deleteClient(person);
clients.remove(person);
clientList.refresh();
}
Комментарии:
1. Рад, что вы разобрались. В любом случае это имеет больше смысла для работы с JavaFX. Обычно лучше всего настроить модель, наблюдаемую представлением. Вот почему я подумал
clientList
, что это список. 🙂