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”按钮。
为什么不对
Button
或Node
类进行子类化并添加此功能?有道理,我可以做到。我宁愿有一个更简单的解决方案。
最佳答案
立即想到两种方法:
使用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");