如何删除事件处理程序上的所有标签,请单击

时间:2019-03-29 14:05:37

标签: java loops javafx eventhandler

我有一个事件处理程序,我想在打印新标签之前清除所有结果标签。我想保留其他不是类型结果的标签。该代码当前仅清除结果的最后一个实例。我需要添加什么循环?

# WRONG
- name: uninstall nomachine
  apt:
    deb: nomachine-enterprise-terminal-server
    state: absent

# RIGHT
- name: Remove "foo" package
  apt:
    name: foo
    state: absent

2 个答案:

答案 0 :(得分:0)

问题是您为listOfCars中的每辆汽车创建了标签“结果”。因此,第一行listLayout.getChildren().removeAll(result)仅会删除最后创建的Label。如果列表中有10辆汽车,则将创建10个Label对象,但是只能通过result引用最后一个。

如果要删除所有创建的标签(并且不删除其他控件),建议您引入Label的子类:

class CarLabel extends Label {
    CarLabel(String str) {
        super(str);
    }
}

然后在您的handle方法中:

public void handle(ActionEvent event) {
    listLayout.getChildren().removeIf(CarLabel.class::isInstance);
    Collections.sort(listOfCars, ListYears.yearCom);
    for(Object o : listOfCars) {
        result = new CarLabel(o.toString());
        result.setTranslateX(20);
        result.setTranslateY(-40);
        listLayout.getChildren().add(result);
    }
}

答案 1 :(得分:-1)

removeAll(result)只会删除listLayout.getChildren()中与元素匹配的result中的元素。

看看官方的documention for removeAll

如果要删除列表中包含的每个元素,请使用clear() method

            @Override
            public void handle(ActionEvent event) { 

                listLayout.getChildren().clear()
                // the list should be empty now
                Collections.sort(listOfCars, ListYears.yearCom);

                for (int i = 0; i < listOfCars.size(); i++) {

                newCarsListings = listOfCars.get(i).toString();

                result = new Label(newCarsListings);
                result.setTranslateX(20);
                result.setTranslateY(-40);

                listLayout.getChildren().addAll(result);

                }
            }
          });