有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图制作一个按钮,当TableView中的多行被选中时,所有选中的行都会被删除

我正在使用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();
    }
});

共 (5) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

    有一种方法可以解决这个问题,按照OP最初的要求使用getSelectedIndices()。以下是解决方案:

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

    这是因为它按降序对索引进行排序,因此只会首先删除最高的索引,这样,要删除的其他项的索引就不会因为删除而改变

    Sometimes you can't use the getSelectedItems() and removeAll(...) functions because removeAll will remove all occurences of the referenced objects. What if your list contains multiple entries with the same referenced object, and you only want to remove one of those references? That's why you need to use the getSelectedIndices() function.

  3. # 3 楼答案

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

    您可以删除selectedItems

    delBtn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent e) {
            data.removeAll(table.getSelectionModel().getSelectedItems());
            table.getSelectionModel().clearSelection();
        }
    });
    
  4. # 4 楼答案

    出于某种原因,这是可行的:

     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

  5. # 5 楼答案

    我在使用ListView(在我的例子中是selectedView)时遇到了类似的问题,而且猜测的项目也被索引删除了。所以我放弃了使用如下所示的循环

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

    改成

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

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