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

时间:2015-06-29 15:17:55

标签: javafx removeall observablelist

我在一个observable列表中有几个复制元素,我在TableView中用于复制/粘贴操作。该表的名称为 cpTable c opy且 p aste T 能够)用于存储复制的元素和粘贴存储在表中的元素。每次粘贴操作后,我想清除cpTable的内容,然后用Ctrl + C复制其他选定的项目。 但我总是得到错误:

  

JavaFX Application Thread“java.lang.UnsupportedOperationException:   不支持。
  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内容 表中的项目。

4 个答案:

答案 0 :(得分:7)

清除您的Observable List。看起来你应该使用copiedItems.clear(); 那应该清理你的桌子。

答案 1 :(得分:3)

正如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,调用它的选择模型来获取所有选中的项目。然后将数据添加到新的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;

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

答案 2 :(得分:1)

假设你的意思

table.getSelectionModel().getSelectedItems()

(因为选择模型没有getItems()方法),根据Javadocs,这会返回只读列表。因此,尝试修改列表将抛出UnsupportedOperationException

要清除选择,请执行

table.getSelectionModel().clearSelection();

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

答案 3 :(得分:1)

如果您要清除tableView中的所有项目,并且只想空tableView。你可以用这个:

myTableView.getItems().clear();

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