2017-07-25 67 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())); 

這種過濾所有的孩子只是標籤,然後將它們映射爲此類。