Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从JavaFX TableView一次删除多行时出现问题_Java_Javafx 2_Javafx - Fatal编程技术网

从JavaFX TableView一次删除多行时出现问题

从JavaFX TableView一次删除多行时出现问题,java,javafx-2,javafx,Java,Javafx 2,Javafx,我正在尝试制作一个按钮,当选中一个列表中的多行时,所有选中的行都将被删除 我正在使用GetSelectedDicies创建一个可观察列表,但它无法正常工作 如果我选择前三行,我让它在删除标记时打印出标记,然后打印0,1,然后删除第一行和第三行,但三行的中间部分没有删除 delBtn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent e) {

我正在尝试制作一个按钮,当选中一个列表中的多行时,所有选中的行都将被删除

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

如果我选择前三行,我让它在删除标记时打印出标记,然后打印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();
    }
});
delBtn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
可观察列表索引=
table.getSelectionModel().getSelectedIndices();
for(int位置:索引){
系统输出打印项次(位置);
数据删除(位置);
}
table.getSelectionModel().clearSelection();
}
});

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

您可以删除
selectedItems

delBtn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
    public void handle(ActionEvent e) {
        data.removeAll(table.getSelectionModel().getSelectedItems());
        table.getSelectionModel().clearSelection();
    }
});
delBtn.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
data.removeAll(table.getSelectionModel().getSelectedItems());
table.getSelectionModel().clearSelection();
}
});

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

 b.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent arg0) {
                    List items =  new ArrayList (treeTable.getSelectionModel().getSelectedItems());  
                    data.removeAll(items);
                    table.getSelectionModel().clearSelection();

                }
            });

b.setOnAction(新的EventHandler

您可以使用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());

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

有一种方法可以解决这一问题,按照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());
    }
ArrayList list=新建ArrayList(listView.getSelectionModel().getSelectedIndices());
Comparator Comparator=Comparator.comparingInt(整数::intValue);
比较器=比较器。反转();
列表.排序(比较器);
for(整数i:列表){
getItems().remove(i.intValue());
}
这是因为它按降序对索引进行排序,因此只会首先删除最高的索引,以便要删除的其他项的索引不会因删除而更改

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


问题在于for循环。您正在按索引删除。如果您有项1、2、3、4,并且删除了索引0,则现在有2、3、4。然后删除索引1处的项(现在是3),留给您2,4。您对我应该做什么有什么建议吗?我想可能是for循环的问题,我只是不确定如何修复它。这似乎应该可以工作,但是当我这样做时,无论我突出显示了什么,它都会清除整个表。我尝试使用GetSelectedDicies()在那里,它没有删除任何内容。轻微更正。它删除最高突出显示行下方的所有内容。因此,如果有100行,我突出显示行10-20,则删除roes 10-99。但有时列表中可能有多个相同引用的项目,您可能只想删除其中一个,而不是两个或更多,因此使用这种方法在这种情况下不起作用,因为它将删除所有此类项引用,您只想删除第一个香蕉,然后使用
removeAll
将删除所有代表同一对象的香蕉,在某些情况下您可能需要这样做…@Wingle我找到了解决方案-请参阅我的答案:-D