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

时间:2013-09-09 14:20:23

标签: java javafx-2 javafx

我正在尝试创建一个按钮,当选择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();
    }
});

5 个答案:

答案 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()函数的原因。