javafx вызвано: java.lang.UnsupportedOperationException

Когда я пытаюсь добавить "объект" в базу данных, а затем показать его в TableView, он показывает мне UnsupportedOperationException . Все было хорошо, пока я не добавил этот код в "public void initialize()", чтобы сделать текстовые поля "SearchBoxes":

FilteredList <Paisjet> filteredData = new FilteredList<>(data,e -> true);

    paisjaSearch.textProperty().addListener((observableValue,oldValue,newValue) -> 
            {
                filteredData.setPredicate( paisjet -> 
                {
                    if(newValue == null || newValue.isEmpty())
                    {
                        return true;
                    }
                    String lowerCaseFilter = newValue.toLowerCase();
                    if(paisjet.getPaisja().toLowerCase().contains(lowerCaseFilter))
                    {
                        return true;
                    }
                    return false;
                });
            });
    kategoriaSearch.textProperty().addListener((observableValue,oldValue,newValue) -> 
            {
                filteredData.setPredicate( paisjet -> 
                {
                    if(newValue == null || newValue.isEmpty())
                    {
                        return true;
                    }
                    String lowerCaseFilter = newValue.toLowerCase();
                    if(paisjet.getKategoria().toLowerCase().contains(lowerCaseFilter))
                    {
                        return true;
                    }
                    return false;
                });
            });
    prodhuesiSearch.textProperty().addListener((observableValue,oldValue,newValue) -> 
            {
                filteredData.setPredicate( paisjet -> 
                {
                    if(newValue == null || newValue.isEmpty())
                    {
                        return true;
                    }
                    String lowerCaseFilter = newValue.toLowerCase();
                    if(paisjet.getProdhuesi().toLowerCase().contains(lowerCaseFilter))
                    {
                        return true;
                    }
                    return false;
                });
            });
    modeliSearch.textProperty().addListener((observableValue,oldValue,newValue) -> 
            {
                filteredData.setPredicate( paisjet -> 
                {
                    if(newValue == null || newValue.isEmpty())
                    {
                        return true;
                    }
                    String lowerCaseFilter = newValue.toLowerCase();
                    if(paisjet.getModeli().toLowerCase().contains(lowerCaseFilter))
                    {
                        return true;
                    }
                    return false;
                });
            });

    SortedList <Paisjet> sortedData = new SortedList<>(filteredData);
    sortedData.comparatorProperty().bind(tableView.comparatorProperty());
    tableView.setItems(sortedData);

ВЫХОД:

Caused by: java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:161)
at java.util.AbstractList$Itr.remove(AbstractList.java:374)
at java.util.AbstractList.removeRange(AbstractList.java:571)
at java.util.AbstractList.clear(AbstractList.java:234)
at main.MainWindowController.clearTable(MainWindowController.java:315)
at main.MainWindowController.addToTableFromDatabase(MainWindowController.java:320)
at main.MainWindowController.addToDatabase(MainWindowController.java:309)
... 61 more

clearTable ():

public void clearTable()
{
    tableView.getItems().clear(); // line 315 at OUTPUT ERROR
}

addToTableFromDatabase ():

public void addToTableFromDatabase() throws ClassNotFoundException, SQLException
{
    clearTable();  //line 320 at OUTPUT ERROR
    Class.forName("com.mysql.jdbc.Driver");
    String url="jdbc:mysql://***.***.**.*:****/*********";
    String uname="*****";
    String pass="*********";
    connect = (Connection) DriverManager.getConnection(url,uname,pass);

    Statement statement;
    String query = "SELECT * FROM paisjettable" ;
    statement = connect.createStatement();
    ResultSet rs = statement.executeQuery(query);

    while(rs.next())
    {

        int id = rs.getInt("id");
        String prodhuesi = rs.getString("prodhuesi");
        String modeli = rs.getString("modeli");
        String paisja = rs.getString("paisja");
        String pjesa = rs.getString("pjesa");
        String infoshtese = rs.getString("infoshtese");
        double qmimi = rs.getDouble("qmimi");
        double punedore = rs.getDouble("punedore");
        double pagesa = rs.getDouble("pagesa");
        int sasia = rs.getInt("sasia");

        paisjet = new Paisjet(id,prodhuesi,modeli,paisja,pjesa,qmimi,punedore,pagesa,sasia,infoshtese);
        data.add(paisjet);
        tableView.setItems(data);
    }

    rs.close();
    connect.close();
}

addToDatabase ():

public void addToDatabase() throws ClassNotFoundException, SQLException
{
    addToDatabaseMethod(count,prodhuesiField.getText(),modeliField.getText(),paisjaField.getText(),pjesaField.getText(),Double.parseDouble(qmimiField.getText()),Double.parseDouble(puneDoreField.getText()),Integer.parseInt(sasiaField.getText()),infoArea.getText());
    count++;
    prodhuesiField.clear();
    modeliField.clear();
    paisjaField.clear();
    pjesaField.clear();
    qmimiField.clear();
    puneDoreField.clear();
    sasiaField.clear();
    infoArea.clear();
    addToTableFromDatabase(); // line 309 from OUTPUT ERROR
}

1 ответ

Решение

Вы установили список поддержки табличного представления (items) в отсортированный список, который нельзя изменить напрямую (потому что он всегда должен быть отсортированной версией своего базового списка). Так table.getItems() возвращает SortedList а также table.getItems().clear() пытается изменить его и выдает исключение.

Вы должны изменить базовый список, который вы называете data в вашем самом первом блоке кода. Вы не показали никакого контекста для блоков кода, поэтому неясно, какова область действия этой переменной, но вам по сути нужно data.clear() вместо table.getItems().clear(),

(Кроме того, вы не хотите звонить table.setItems(data) в вашей петле в addToTableFromDatabase, так как это уберет фильтрацию и сортировку.)

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