2017-07-25 224 views
0

恢复窗格中包含的标签的文本这是一个问题,我一直试图处理好一个小时,所以我想我可能会请问这个问题。我的目标/问题是关于pane.getChildren()提供的列表的行为。为了更好地解释,下面是一些示例代码。Javafx:通过pane.getChildren()。get(index)

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()获得(I)不允许我使用标签相关的方法(比如gettext的(),这是我有兴趣访问的人)。究竟发生了什么,为什么不将pane1.getChildren()。get(i)确认为Label?

而且值得补充的是,如果我运行

for (int i=0; i<pane1.getChildren().size(); i++) { 
    System.out.println(i + pane1.getChildren().get(i).getClass().getName()); 
} 

控制台输出称,该类的名称是“javafx.scene.control.Label”。

我很想澄清一下这个小问题,并且提前感谢您!

+0

只是沮丧而已。但是,你为什么要这么做呢?您已经拥有对标签的引用。 –

回答

1

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... 
    }); 

当然这个的,但如果您将某些内容放在不是标签的窗格中,将无法工作(没有额外的检查)。

+0

感谢您的回答!这里有一些程序可以开发,所以我仍然忘记了某些概念。 – ingrm

+0

@ingrm基本点是编译器不知道列表中的东西是'Label'。您可以添加许多其他类型的东西到该列表中。 –

0

如果需要垂头丧气它可以在流来完成:

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

这种过滤所有的孩子只是标签,然后将它们映射为此类。