JavaFX TabPane remove / removeAll不起作用

时间:2015-12-27 20:41:01

标签: javafx tabpanel

美好的一天,我在尝试从JavaFX中的TabPane中删除选项卡时遇到问题。 我要做的第一件事是将带有列表中所选选项卡名称的String的ArrayList传递给方法,该方法假设从TabPane中删除相应的名称选项卡:

removeBranch.setOnAction(e->{
            ArrayList<String>indexes=new ArrayList(list.getSelectionModel().getSelectedItems());

            entryShifts.removeBranch(indexes);
            list.getItems().removeAll(indexes);

        });

之后我尝试在上述方法中删除它们:

public void removeBranch(ArrayList<String> branch){
           pane.getTabs().removeAll(branch);
    }

然而它不起作用,即使我做了类似的事情(请注意我只传递列表中的第一个名字):

public void removeBranch(ArrayList<String> branch){
        pane.getTabs().remove(branch.get(0));
    }

但是,如果我做这样的事情,它可以工作(这里我只删除ArrayList中的第一个名字):

public void removeBranch(ArrayList<String> branch){
        pane.getTabs().forEach(i -> {
            if (i.getText().equals(branch.get(0))) {
                Platform.runLater(() -> {
                    pane.getTabs().remove(i);
                });
            }
        });
    }

为什么会这样?我做错了吗?

P.S我通过循环遍历ArrayList并每次将不同的名称传递给方法来修复它的方式:

indexes.forEach(i->{entryShifts.removeBranch(i);});

public void removeBranch(String branch){
        pane.getTabs().forEach(i -> {
            if (i.getText().equals(branch)) {
                Platform.runLater(() -> {
                    pane.getTabs().remove(i);
                });
            }
        });
    }

1 个答案:

答案 0 :(得分:3)

您的问题是,pane.getTabs()会返回Tab的列表,并且您正在尝试在其中找到String。您需要一种方法将字符串(Tab名称?)转换为Tab中的实际TabPane节点。

其中一种方法是使用标签名称和标签初始化Map<String, Tab> map,然后执行以下操作:

List<Tab> tabs = branch.stream().map(map::get).collect(Collectors.toList());
pane.getTabs().removeAll(tabs);