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

Vol*_*ort 2 java javafx

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

    somePane.getChildren().add(A,B,C);
Run Code Online (Sandbox Code Playgroud)

现在,让我们走向遥远的未来.我有一个参考somePane,我有兴趣访问按钮B.

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

    somePane.getChildren().get(1); // returns the second button
Run Code Online (Sandbox Code Playgroud)

但是,我对此并不满意,因为它似乎容易出错.

在我看来,拥有某种标签系统会非常有用.像这样:

    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);
Run Code Online (Sandbox Code Playgroud)

然后你可以做到

    somePane.getChildren().getByTag("B");  // returns the second button
Run Code Online (Sandbox Code Playgroud)

JavaFX有这样的东西吗?


你可能想知道:

  • 为什么我不把这个按钮B变成我班级的固定属性?
    • 这些按钮和窗格是动态创建的.我可以有几个窗格,都有自己的"B"按钮.
  • 为什么我不对子类Button或Node类进行子类化并添加此功能?
    • 有道理,我可以做到.我宁愿有一个更简单的解决方案.

Jam*_*s_D 6

立即想到两种方式:

使用该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 ;
}
Run Code Online (Sandbox Code Playgroud)

或者,使用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");
Run Code Online (Sandbox Code Playgroud)