0

「オブジェクト」をデータベースに追加して 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
}
4

1 に答える 1

3

テーブル ビューのバッキング リスト ( items) をソート済みリストに設定しましたが、直接変更することはできません (これは常に、基になるリストのソート済みバージョンであることが想定されているためです)。したがって、をtable.getItems()返し、SortedListそれtable.getItems().clear()を変更しようとして例外をスローします。

data最初のコード ブロックで呼び出す基になるリストを変更する必要があります。コード ブロックのコンテキストを示していないため、その変数のスコープが明確ではありませんが、基本的data.clear()table.getItems().clear().

table.setItems(data)(また、でループを呼び出す必要はありませんaddToTableFromDatabase。これにより、フィルタリングと並べ替えが削除されます。)

于 2016-11-08T17:15:46.737 に答える