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



这是我一个小时以来一直在努力处理的问题,所以我想我不妨问这个问题。我的目标/问题是关于 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( 不允许我使用与标签相关的方法(例如 getText((,这是我有兴趣访问的方法(。这里到底发生了什么,为什么 pane1.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...
});

但是,如果您在窗格中放置不是标签的内容,这当然不起作用(没有额外的检查(。

如果需要向下投射,可以在流中完成:

pane1.getChildren()
.stream()
.filter(Label.class::isInstance)
.map(Label.class::cast)
.forEach(label -> System.out.println(label.getText()));

这会将所有子项过滤为标签,然后按标签进行映射。

最新更新