javafx从VBox中删除特定节点

时间:2016-03-06 14:37:14

标签: javafx

我有以下方法:

CreateStrip createStrip = new CreateStrip(input);
depBox.getChildren().add(createStrip.getStripGrid());

depBox是一个VBox,而.getStripGrid()返回一个GridPane。 CreateStrip也有这个方法:

public String getNameStrip() { return input.getNameStrip();}
在程序生活期间,depBox获得了许多GridPane,每个都有一个不同的NameStrip。 有时我需要从depBox中删除与.getNameStrip()匹配的特定GridPane。 我试过了:

    for (Node node: depBox.getChildren()) {

//TODO REMOVE GRIDPANE CONTAIN THE NAME THAT MATCH WITH THE MESSAGE RECEIVED..
            }

但我不知道如何设置匹配控件。

1 个答案:

答案 0 :(得分:1)

第1步:

将数据附加到GridPane,以便您识别要删除的数据。

您可以使用Node.setUserData或使用properties Map(我将在以下代码段中执行此操作)来执行此操作。

创建GridPane

GridPane gp = createStrip.getStripGrid();
gp.getProperties().put(NAME_KEY, createStrip);
depBox.getChildren().add(gp);
// use object not equal to any other object as key (i.e. equals uses reference equality)
static final Object NAME_KEY = new Object(); 

第2步:

使用该信息删除相应的GridPanesearchNameString,用于标识您要删除的GridPane(以检查与getNameStrip()的相等性):

depBox.getChildren().removeIf(c -> {
     CreateStrip strip = (CreateStrip) c.getProperties().get(NAME_KEY);
     return strip != null && searchName.equals(strip.getNameStrip());
});

根据您的CreateStrip类,可能没有必要将其实例添加为属性。它可能不是正确的做法,如果它是一个工厂,但我认为你得到了这个想法。

替代

您还可以为id的{​​{1}}属性分配值,并使用这些值来使用Node标识正确的节点。但是,这些必须是唯一的并且是有效的css ID,但您可以使用Node.lookup从消息映射到Map