2017-07-25 10 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)がラベルとして認識されていませんか?私は

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のコンパイル時の型を有しています。

なぜこれを行う必要があるのか​​は明らかではありません。ペインの子リストを反復することなく、ラベルへの参照が既にあります。

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

もちろん、この:あなたは本当にペインの子リストからこれを取得したいのであれば、あなただけの明白なダウンキャストを行う、

Stream.of(label1, label2).map(Label::getText).forEach(text -> { 
    // whatever you need to do with the text... 
}); 

を単に行うことができますラベルではないペインに何かを置くと、余分なチェックをしなくても動作しません。

+0

答えをありがとう!ここではプログラミングの始まりがあるので、私はまだいくつかの概念を忘れています。 – ingrm

+0

@ingrm基本的な点は、リスト内のものが 'Label'sであることをコンパイラーが知らないということです。あなたはそのリストに他の多くの種類のものを追加することができます。 –

0

あなたがダウンキャストする必要がある場合には、ストリーム内で行うことができます。

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

これは、そのようにマッピングし、ただのラベルであることを、すべての子どもたちをフィルタリングします。