无法清除 ObservableList 中的所有项目(元素)

Can't clear all items (elements) in an ObservableList

我在 observablelist 中复制了几个元素,用于 TableView 中的 copy/paste 操作。 table 的名称是 cpTablecopy 和 paste Table) 用于存储复制的元素和粘贴存储在 table 中的元素。每次粘贴操作后,我想在使用 Ctrl+C 复制其他选定项目之前清除 cpTable 的内容。 但我总是得到错误:

JavaFX Application Thread" java.lang.UnsupportedOperationException: Not supported.
at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.remove(ReadOnlyUnbackedObservableList.java:246)

这是我的伪代码:

if (cpTable !=null) {
    //first, get all copied items for removing all elements 
    ObservableList<String> copiedItems = cpTable.getItems();                                 
    int size = copiedItems.size();

    // remove all elements 
    for(int i=0;i<size;i++) {
        copiedItems.remove(i);
    }
    cpTable.setItems(copiedItems); //clear cpTable by setting an empty list
}

这是一种复制选中项的内容并将其放入cpTable的方法

public TableView<String> copySelectionToClipboard(TableView<String> table) {            
    ObservableList<String> data =     table.getSelectionModel().getSelectedItems();             
    TableView<String> tmp = new TableView<>();
    tmp.setItems(data);
    return tmp;

}

当按下 Ctrl+C 时,以下行将所有复制的项目放入 cpTable:

cpTable = copySelectionToClipboard( (TableView<String>) keyEvent.getSource());

如前所述,我想在粘贴后立即清除所有 cpTable 内容 table.

中的项目

假设你的意思是

table.getSelectionModel().getSelectedItems()

(因为选择模型没有getItems()方法),根据Javadocs,这个returns一个read-only列表.因此尝试修改列表将抛出 UnsupportedOperationException

要清除选择,请执行

table.getSelectionModel().clearSelection();

(同样,如果您想以任何其他方式操作选择,您可以在选择模型上使用方法,而不是在列表上。)

正如James_D已经提到的,您还没有弄清楚重点是什么。

如果要从 table 中删除所选项目,您需要从 table 项目列表本身而不是从选择模型中删除它们。

可能的解决方案如下所示:

TableView<String> table = new TableView<>();
ObservableList<String> tableItems = table.getItems();

// needs multirowselection is set to true
ObservableList<String> readOnlyItems = table.getSelectionModel().getSelectedItems(); 

// removes all selected elements for the table
readOnlyItems.stream().forEach((item) -> {
    tableItems.remove(item);
});

// clear the selection
table.getSelectionModel().clearSelection();

更新

此方法获取一个 TableView,调用它的选择模型以获取所有选定项。然后将数据添加到新的 TableView。问题来了!这是您附加到新 table 的不可修改的只读列表。首先使其可修改,如下面的代码所示:

public TableView<String> copySelectionToClipboard(TableView<String> table) {            
    ObservableList<String> readOnlyData = table.getSelectionModel().getSelectedItems();
    ObservableList<String> writableData = FXCollections.<String>observableArrayList(readOnlyData);
    TableView<String> tmp = new TableView<>();
    tmp.setItems(writableData);
    return tmp;

下一个问题是您对该方法的调用。您可以根据方法需要使用 TableView<CsvData>TableView<String> 来调用它。如果 CsvData 是 String 的子类型,则必须将方法签名更改为 TableView<? extends String>

只需清除您的 Observable 列表。看起来你应该使用 copiedItems.clear(); 那应该清除你的 table.

如果您正在尝试清除 tableView 中的所有项目并且只想要一个空的 tableView。你可以使用这个:

myTableView.getItems().clear();

这基本上是从您的 table 视图中获取所有项目,这只是可观察列表,现在它执行清除操作以删除 tableView 中的所有项目。