从JavaFX TableView一次删除多行的问题

我正在尝试创建一个按钮,当选择TableView中的多行时,将删除所有选定的行。

我正在使用getSelectedIndicies创建一个可观察的列表,但它无法正常工作。

如果我选择前三行,我会打印出指示,因为它会删除它们并打印0,1然后它会删除第一行和第三行,但三行的中间不会被删除。

 delBtn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { ObservableList index = table.getSelectionModel().getSelectedIndices(); for (int location: index) { System.out.println(location); data.remove(location); } table.getSelectionModel().clearSelection(); } }); 

出于某种原因,这有效:

  b.setOnAction(new EventHandler() { @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

删除使用索引无法工作,因为在每次抑制时,其余索引都会更改。

您可以删除selectedItems

 delBtn.setOnAction(new EventHandler() { @Override public void handle(ActionEvent e) { data.removeAll(table.getSelectionModel().getSelectedItems()); table.getSelectionModel().clearSelection(); } }); 

您可以使用for循环,它会对表选择进行快照,并在其中进行迭代。 例如:

 @FXML private void deleteButtonFired(ActionEvent actionEvent) throws InterruptedException { for(Object o : table.getSelectionModel().getSelectedItems()){ table.getItems().remove(o); } table.getSelectionModel().clearSelection(); } 

我希望他们能解决这个问题。

我使用ListView(在我的情况下是selectedView)遇到了类似的问题,并且还通过索引删除了猜测的项目。 所以我放弃了使用如下所示的循环

 selectedView.getSelectionModel().getSelectedItems().forEach(i -> selectedView.getItems().remove(i)); 

改变它

 selectedView.getItems().removeAll(selectedView.getSelectionModel().getSelectedItems()); 

哪个工作得很好。 希望这可以帮助任何人。

有一种方法可以使用getSelectedIndices()作为最初需要的OP。 这是解决方案:

  ArrayList list = new ArrayList<>(listView.getSelectionModel().getSelectedIndices()); Comparator comparator = Comparator.comparingInt(Integer::intValue); comparator = comparator.reversed(); list.sort(comparator); for(Integer i : list) { listView.getItems().remove(i.intValue()); } 

这是有效的,因为它按降序对索引进行排序,因此仅首先删除最高索引,以便删除其他项目的索引不会因删除而更改。

有时你不能使用getSelectedItems()removeAll(...)函数,因为removeAll将删除所引用对象的所有出现。 如果您的列表包含多个具有相同引用对象的条目,并且您只想删除其中一个引用,该怎么办? 这就是你需要使用getSelectedIndices()函数的原因。