我正在尝试创建一个按钮,当选择TableView中的多行时,将删除所有选定的行。
我正在使用getSelectedIndicies
创建一个可观察的列表,但它无法正常工作。
如果我选择前三行,我会打印出标记,因为它会删除它们并打印0,1然后它会删除第一行和第三行,但不删除三行的中间部分。 / p>
delBtn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
ObservableList<Integer> index =
table.getSelectionModel().getSelectedIndices();
for (int location: index) {
System.out.println(location);
data.remove(location);
}
table.getSelectionModel().clearSelection();
}
});
答案 0 :(得分:6)
出于某种原因,这有效:
b.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
List items = new ArrayList (treeTable.getSelectionModel().getSelectedItems());
data.removeAll(items);
table.getSelectionModel().clearSelection();
}
});
我怀疑selectedItems列表(com.sun.javafx.collections.ObservableListWrapper)的内部实现可能有一些错误。
修改强> 是的,这绝对是一个错误:https://javafx-jira.kenai.com/browse/RT-24367
答案 1 :(得分:3)
删除使用索引无法正常工作,因为在每次抑制时,剩余的索引都会发生变化。
您可以删除selectedItems
:
delBtn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent e) {
data.removeAll(table.getSelectionModel().getSelectedItems());
table.getSelectionModel().clearSelection();
}
});
答案 2 :(得分:0)
您可以使用for循环,它会创建表选择的快照并在其中进行迭代。例如:
@FXML
private void deleteButtonFired(ActionEvent actionEvent) throws InterruptedException {
for(Object o : table.getSelectionModel().getSelectedItems()){
table.getItems().remove(o);
}
table.getSelectionModel().clearSelection();
}
我希望他们能解决这个问题。
答案 3 :(得分:0)
我使用ListView(在我的情况下是selectedView)遇到了类似的问题,并且猜测的项目也被索引删除了。所以我放弃了使用如下所示的循环
selectedView.getSelectionModel().getSelectedItems().forEach(i -> selectedView.getItems().remove(i));
将其更改为
selectedView.getItems().removeAll(selectedView.getSelectionModel().getSelectedItems());
哪个工作得很好。希望这有助于任何人。
答案 4 :(得分:0)
使用getSelectedIndices()
可以解决此问题,这是OP最初需要的。解决方法如下:
ArrayList<Integer> list = new ArrayList<>(listView.getSelectionModel().getSelectedIndices());
Comparator<Integer> comparator = Comparator.comparingInt(Integer::intValue);
comparator = comparator.reversed();
list.sort(comparator);
for(Integer i : list) {
listView.getItems().remove(i.intValue());
}
之所以起作用,是因为它按降序对索引进行排序,因此仅首先删除最高索引,以使其他要删除的项目的索引不会因删除而更改。
有时您不能使用
getSelectedItems()
和removeAll(...)
函数,因为removeAll
将删除所有引用对象的出现。如果您的列表包含具有相同引用对象的多个条目,而您只想删除这些引用之一,该怎么办?这就是为什么您需要使用getSelectedIndices()
函数的原因。