我在一个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内容 表中的项目。
答案 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
中的所有项目。