在节点中查找特定节点';JavaFX中的子列表

在节点中查找特定节点';JavaFX中的子列表,java,javafx,Java,Javafx,现在,让我们走向遥远的未来。我参考了somePane,我对访问按钮B感兴趣 从技术上讲,我们可以这样做 Button A = new Button(); Button B = new Button(); Button C = new Button(); somePane.getChildren().add(A,B,C); 然而,我对此并不满意,因为它似乎容易出错 我突然想到,拥有某种标签系统是非常有用的。像这样: somePane.getChildre

现在,让我们走向遥远的未来。我参考了
somePane
,我对访问按钮
B
感兴趣

从技术上讲,我们可以这样做

    Button A = new Button();
    Button B = new Button();
    Button C = new Button();

    somePane.getChildren().add(A,B,C);
然而,我对此并不满意,因为它似乎容易出错

我突然想到,拥有某种标签系统是非常有用的。像这样:

    somePane.getChildren().get(1); // returns the second button
那你就可以做了

    Button A = new Button();
    Button B = new Button();
    Button C = new Button();

    A.tag = "A";
    B.tag = "B";
    C.tag = "C";

    somePane.getChildren().add(A,B,C);
JavaFX有类似的功能吗


你可能想知道:

  • 为什么我不把按钮
    B
    作为类的固定属性呢?
    • 这些按钮和窗格是动态创建的。我可以有几个窗格,都有自己的“B”按钮
  • 为什么我不将
    按钮
    节点
    类划分为子类并添加此功能?
    • 有道理,我能做到。不过,我宁愿有一个更简单的解决方案

两种方法会立即浮现在脑海中:

使用
userData
属性:

    somePane.getChildren().getByTag("B");  // returns the second button
或者,使用CSS id和
lookup()
方法。请注意,只有将CSS应用于节点后,这才会起作用,这实际上意味着它们必须是实时场景图的一部分

Button a = new Button();
a.setUserData("A");
Button b = new Button();
b.setUserData("B");
Button c = new Button();
c.setUserData("C");
somePane.getChildren().addAll(a, b, c);

// ...

private Node getByUserData(Parent parent, Object data) {
    for (Node n : parent.getChildren()) {
        if (data.equals(n.getUserData())) {
            return n ;
        }
    return null ;
}
Button a = new Button();
a.setId("A");
Button b = new Button();
b.setId("B");
Button c = new Button();
c.setId("C");
somePane.getChildren().addAll(a, b, c);

// ...

Button button = (Button) somePane.lookup("#B");