4

I am trying to make a button that, when multiple rows in a TableView are selected, all of the selected rows are removed.

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

如果我选择前三行,我让它打印出索引,因为它删除它们并打印 0,1,然后它删除第一行和第三行,但三行的中间没有被删除。

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();
    }
});
4

5 回答 5

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

于 2013-09-10T07:31:42.487 回答
4

无法使用索引删除,因为在每次抑制时,剩余的索引都会发生变化。

您可以删除selectedItems

delBtn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent e) {
        data.removeAll(table.getSelectionModel().getSelectedItems());
        table.getSelectionModel().clearSelection();
    }
});
于 2013-09-09T15:53:07.347 回答
0

You can use a for loop, it make a snapshoot of your table selection and iterate in it. For exmple:

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

I hope they fix this bug.

于 2014-05-21T14:24:10.000 回答
0

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

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

将其更改为

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

效果很好。希望这对任何人都有帮助。

于 2016-07-22T10:06:40.633 回答
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()andremoveAll(...)函数,因为removeAll会删除所有引用对象的出现。如果您的列表包含多个具有相同引用对象的条目,而您只想删除其中一个引用怎么办?这就是您需要使用该getSelectedIndices()功能的原因。

于 2018-07-26T15:56:30.160 回答