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类进行子类化并添加此功能?

有道理,我可以做到。我宁愿有一个更简单的解决方案。

最佳答案

立即想到两种方法:

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

07-24 09:44
查看更多