无法清除 ObservableList 中的所有项目(元素)
Can't clear all items (elements) in an ObservableList
我在 observablelist 中复制了几个元素,用于 TableView 中的 copy/paste 操作。 table 的名称是 cpTable(copy 和 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
中的所有项目。
我在 observablelist 中复制了几个元素,用于 TableView 中的 copy/paste 操作。 table 的名称是 cpTable(copy 和 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
中的所有项目。