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

时间:2014-07-26 13:47:20

标签: java javafx

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

    somePane.getChildren().add(A,B,C);

现在,让我们走向遥远的未来。我引用了somePane,我有兴趣访问按钮B

从技术上讲,人们可以做类似

的事情
    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);

然后你可以做

    somePane.getChildren().getByTag("B");  // returns the second button

JavaFX有这样的东西吗?


您可能想知道:

  • 为什么我不把按钮B作为我班级的固定财产?
    • 这些按钮和窗格是动态创建的。我可以有几个窗格,都有自己的“B”按钮。
  • 为什么我不对ButtonNode类进行子类化并添加此功能?
    • 有道理,我可以做到。我宁愿有一个更简单的解决方案。

1 个答案:

答案 0 :(得分:5)

立即想到两种方式:

使用userData属性:

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 ;
}

或者,使用CSS ID和lookup()方法。请注意,只有在CSS应用于节点后才能使用,这实际上意味着它们必须是实时场景图的一部分。

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");