Java 如何删除事件处理程序上的所有标签单击
我有一个事件处理程序,我想在打印新标签之前清除所有结果标签。我想保留其他不是result类型的标签。代码当前仅清除结果的最后一个实例。我需要添加什么循环Java 如何删除事件处理程序上的所有标签单击,java,loops,javafx,eventhandler,Java,Loops,Javafx,Eventhandler,我有一个事件处理程序,我想在打印新标签之前清除所有结果标签。我想保留其他不是result类型的标签。代码当前仅清除结果的最后一个实例。我需要添加什么循环 @Override public void handle(ActionEvent event) { listLayout.getChildren().removeAll(result); Collections.sort(listOfCars, ListYears.yearCom); for (int i = 0;
@Override
public void handle(ActionEvent event) {
listLayout.getChildren().removeAll(result);
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);
}
}
@覆盖
公共无效句柄(ActionEvent事件){
listLayout.getChildren().removeAll(结果);
Collections.sort(listOfCars,ListYears.yearCom);
for(int i=0;i
removeAll(result)
只会删除listLayout.getChildren()
中与result
中的元素匹配的元素
看一看那位官员
如果要删除列表中包含的每个元素,请使用clear()
@覆盖
公共无效句柄(ActionEvent事件){
listLayout.getChildren().clear()
//列表现在应该是空的
Collections.sort(listOfCars,ListYears.yearCom);
for(int i=0;i
问题在于,您为车辆列表中的每辆车创建了“结果”标签。因此,您的第一行listLayout.getChildren().removeAll(result)
将只删除上次创建的标签。如果列表中有10辆车,则将创建10个标签对象,但只能通过result
引用最后一个标签对象
如果您想删除所有创建的标签(而不删除其他控件),我建议您引入Label
的子类:
class CarLabel extends Label {
CarLabel(String str) {
super(str);
}
}
然后在您的句柄方法中:
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);
}
}
@Wugi问题是.clear()删除布局中的所有内容,包括我希望保留的按钮和文本字段。我试图只删除result的实例,但使用.removeAll(result)只删除result Created的最后一个实例。那么您应该尝试澄清您的问题。子类真的有必要吗?如果他想删除所有标签,你可以很容易地调用removeIf(Label.class::isInstance)
。@Zephyr我不知道你剩下的代码。只有当您的列表布局
中有其他不代表汽车的标签
对象时,此子类才是必需的。我不是OP.:)他们只是问如何删除所有标签;也许如果他们在问题中更清楚,我们可以给出一个更明确的答案。我在那里编辑了描述,我想保留布局中的其他标签,添加子类是有效的。感谢you@GearoidSheehan-如果此答案解决了您的问题,请确保通过单击上面的复选标记来接受。创建一个名为“删除”的新ArrayList
。在子项中循环查找符合标准的标签。将这些标签添加到删除ArrayList
。循环完成后,使用listLayout.getChildren().removeAll(删除)代码>。这似乎是一个设计缺陷。有人会认为,与其创建新的标签
,不如使用setText()
来更新标签
。
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);
}
}