Javafx:通过pane.getChildren().get(索引)恢复窗格中包含的标签文本

Javafx:通过pane.getChildren().get(索引)恢复窗格中包含的标签文本,java,javafx,Java,Javafx,这是我一个小时以来一直在努力解决的问题,所以我想我还是问这个问题为好。我的目标/问题是关于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.getCh

这是我一个小时以来一直在努力解决的问题,所以我想我还是问这个问题为好。我的目标/问题是关于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).(??????????)
}
VBox pane1=新的VBox();
标签1=新标签(“a”);
标签2=新标签(“b”);
pane1.getChildren().addAll(label1,label2);
System.out.println(pane1.getChildren().size());
for(int i=0;i返回一个
可观察列表
,因此
pane1.getChildren().get(i)
的编译时类型为
节点
,而不是
标签

不清楚您为什么需要这样做:您已经有了对标签的引用,而没有遍历窗格的子项列表

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()
     .filter(Label.class::isInstance)
     .map(Label.class::cast)
     .forEach(label -> System.out.println(label.getText()));

这会将所有子项过滤为标签,然后将它们映射为标签。

只需将其向下转换即可。但为什么要这样做呢?您已经有了对标签的引用。谢谢您的回答!这里有点编程新手,所以我仍然会忘记某些概念。@ingrm基本点是编译器不知道列表是
Label
s。您可以将许多其他类型的内容添加到该列表中。
pane1.getChildren().stream()
    .map(Label.class::cast)
    .map(Label::getText)
    .forEach(text -> {
        // whatever you need to do with text...
    });
pane1.getChildren()
     .stream()
     .filter(Label.class::isInstance)
     .map(Label.class::cast)
     .forEach(label -> System.out.println(label.getText()));