这是我已经尝试解决一个小时的问题,因此我想我也可以问这个问题。我的目标/问题是关于pane.getChildren()提供的列表的行为。为了更好地解释,这里有一些示例代码。
VBox pane1 = new VBox();
Label label1 = new Label("a");
Label label2 = new Label("b");
pane1.getChildren().addAll(label1,label2);
System.out.println(pane1.getChildren().size());
for (int i=0; i<pane1.getChildren().size(); i++) {
System.out.println(i + pane1.getChildren().get(i).(??????????)
}
列表pane1.getChildren()的大小为2,但是pane1.getChildren()。get(i)不允许我使用与Label相关的方法(例如getText(),这是我感兴趣的方法)在访问中)。这里到底发生了什么,为什么不将panel1.getChildren()。get(i)确认为标签?
同样值得补充的是,如果我跑步
for (int i=0; i<pane1.getChildren().size(); i++) {
System.out.println(i + pane1.getChildren().get(i).getClass().getName());
}
控制台输出显示,该类的名称为“ javafx.scene.control.Label”。
我希望澄清一下这个小问题,并在此先感谢您!
最佳答案
Pane.getChildren()
返回一个ObservableList<Node>
,因此pane1.getChildren().get(i)
的编译时类型为Node
,而不是Label
。
目前尚不清楚为什么需要这样做:您已经具有对标签的引用,而无需遍历窗格的子级列表。所以你可以做
Stream.of(label1, label2).map(Label::getText).forEach(text -> {
// whatever you need to do with the text...
});
如果您真的想从窗格的子级列表中获取此信息,请执行明显的向下转换:
for (Node n : pane1.getChildren()) {
String text = ((Label) n).getText();
// ...
}
要么
pane1.getChildren().stream()
.map(Label.class::cast)
.map(Label::getText)
.forEach(text -> {
// whatever you need to do with text...
});
但是,如果您在窗格中放置了非标签的东西,这当然是行不通的(不做额外的检查)。