Javafx Can';t清除ObservableList中的所有项(元素)

Javafx Can';t清除ObservableList中的所有项(元素),javafx,removeall,observablelist,Javafx,Removeall,Observablelist,我在observablelist中复制了两个元素,用于在TableView中执行复制/粘贴操作。表名为cpTable(copy和pasteTable),用于存储复制的元素和粘贴存储在表中的元素。在每次粘贴操作之后,我想先清除cpTable的内容,然后再使用Ctrl+C复制其他选定项。 但我总是犯错误: JavaFX应用程序线程“java.lang.UnsupportedOperationException: 不支持。 位于com.sun.javafx.scene.control.ReadOnly

我在observablelist中复制了两个元素,用于在TableView中执行复制/粘贴操作。表名为cpTablecopy和pasteTable),用于存储复制的元素和粘贴存储在表中的元素。在每次粘贴操作之后,我想先清除cpTable的内容,然后再使用Ctrl+C复制其他选定项。 但我总是犯错误:

JavaFX应用程序线程“java.lang.UnsupportedOperationException: 不支持。
位于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
}
if(cpTable!=null){
//首先,获取所有复制项以删除所有元素
ObservableList copiedItems=cpTable.getItems();
int size=copiedItems.size();
//删除所有元素
对于(inti=0;i假设你的意思是

table.getSelectionModel().getSelectedItems()
(由于选择模型没有
getItems()
方法),根据,这将返回一个只读的列表。因此,尝试修改列表将抛出一个
不支持操作异常

要清除所选内容,请执行以下操作:

table.getSelectionModel().clearSelection();

(类似地,如果您想以任何其他方式操纵选择,您可以使用选择模型上的方法,而不是列表上的方法。)

正如James_D已经提到的,您还没有明确指出重点所在

如果要从表中删除选定项,则需要从表项列表本身而不是从选择模型中删除它们

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

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 table=newtableview();
ObservableList tableItems=table.getItems();
//“需要多行选择”设置为true
ObservableList readOnlyItems=table.getSelectionModel().getSelectedItems();
//删除表的所有选定元素
readOnlyItems.stream().forEach((项目)->{
tableItems。删除(项目);
});
//清除所选内容
table.getSelectionModel().clearSelection();
更新 此方法get是一个TableView,调用其选择模型以获取所有选定项。然后将数据添加到新的TableView。这就是问题所在!它是一个附加到新表的不可修改只读列表。请首先使其可修改,如下面的代码所示:

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;
public TableView copySelectionToClipboard(TableView表){
ObservableList readOnlyData=table.getSelectionModel().getSelectedItems();
ObservableList writableData=FXCollections.observableArrayList(readOnlyData);
TableView tmp=新的TableView();
tmp.setItems(可写数据);
返回tmp;

下一个问题是调用此方法。您可以根据方法需要使用
TableView
TableView
调用它。如果CsvData是字符串的子类型,则必须将方法签名更改为
TableView只需清除可观察列表。看起来您应该使用
copiedItems.clear();

这将清除您的表。

如果您试图从
表视图中清除所有项目,并且只需要一个空的
表视图
。您可以使用以下方法:

myTableView.getItems().clear();

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

中的所有项目。好的,我编辑了我的问题。请再次查看我的伪代码。我不想清除表选择。相反,我想清除列表中的所有项目。ok、 我编辑了我的问题。请看一下我的伪代码。@Ramses您如何创建表项?或表项列表?能否显示您的代码。可能您从FXCollections获得的集合未由备份集合初始化或是只读的。我的代码太大太复杂,无法放在这里。因此,我添加了m最重要的方法,copySelectionToClipboard和cpTable声明行
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;
myTableView.getItems().clear();