尝试从@fxml tableview中删除时出现java.lang.unsupportedoperationexception

umuewwlo  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(401)

我不明白为什么这个方法不起作用,因为它三天前就起作用了。每当我尝试使用该方法(按下按钮)时,数据库操作都可以正常工作,但是每当我尝试从实际的表视图中删除时,程序就会抛出一个错误,这样用户就不会再看到该行了。我向initialize方法添加了一个过滤列表,我担心这可能是问题的原因。这是我的密码:
初始化方法:

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();
    }
cczfrluj

cczfrluj1#

在某种程度上理解了,但希望得到更深入的解释。我没有从clientlist(tableview)中删除,而是直接从客户机(observeList)中删除,并使该变量成为全局变量,以便通过其他方法访问。我不确定最初问题背后的原因。

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

vx6bjr1n2#

嗯,这只是猜测。但有可能 clientList 是一个 List<> 使用创建的类型 Collections.unmodifiableList() . 当您尝试修改其中一个时 UnsupportedOperationException 被抛出。
public static list unmodifiablelist(列表<?扩展(t>列表)
返回指定列表的不可修改视图。此方法允许模块向用户提供对内部列表的“只读”访问。对返回列表的查询操作“读取”到指定的列表,并尝试修改返回的列表(无论是直接修改还是通过其迭代器修改),都会导致unsupportedoperationexception。
请参见:https://docs.oracle.com/javase/8/docs/api/java/util/collections.html#unmodifiablelist-java.util.list-

相关问题