5

我在一个可观察列表中有几个复制的元素,用于在 TableView 中进行复制/粘贴操作。表的名称cpTable复制粘贴表),用于存储复制的元素和粘贴存储在表中的元素。每次粘贴操作后,我想在使用 Ctrl+C 复制其他选定项目之前清除 cpTable 的内容。但我总是得到错误:

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
}

这是一种复制所选项目内容并将其放入 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

4 回答 4

8

只需清除您的可观察列表。看起来你应该使用copiedItems.clear(); That 应该清除你的表。

于 2016-04-08T15:56:07.313 回答
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();

更新

这个方法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;

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

于 2015-06-29T17:55:47.303 回答
2

如果您试图清除您的所有项目tableView并且只想要一个空的tableView. 你可以使用这个:

myTableView.getItems().clear();

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

于 2017-11-22T17:28:21.680 回答
1

假设你的意思

table.getSelectionModel().getSelectedItems()

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

要清除选择,请执行

table.getSelectionModel().clearSelection();

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

于 2015-06-29T15:24:41.613 回答