这是我已经尝试解决一个小时的问题,因此我想我也可以问这个问题。我的目标/问题是关于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...
    });


但是,如果您在窗格中放置了非标签的东西,这当然是行不通的(不做额外的检查)。

07-26 04:58