2016-12-07 10 views
0

JavaFXとシーンビルダを使用して、コントローラからLabel内のテキストにアクセスしようとしています。コントローラには以下のよう コントローラからテキストを取得するためにラベルからfx:idを取得

私はラベルを初期化:

@FXML 
private Label label1; 

次のコードは、FXMLファイルである:私はコントローラ使用シーンでこの機能にラベルを結合した

<Label fx:id="lable1" onMouseClicked="#handleLabel" text="Label 1" /> 

ビルダー:

private void handleLabel(MouseEvent event) { 
// get text from label n 
} 

私の考えはlabel1.getText()。しかし、そのためには、ラベルのfx:idを取得する必要があります。ラベルがたくさんあるので、すべてのidケースを個別にハードコードすることはできません。

Better way for Getting id of the clicked Object in JavaFX controller 私はこれを見つけましたが、ラベルの初期化とIDの設定が@FXMLに対応していないため、この回答がうまくいくとは思いません。 また、コンポーネントのfx:idにアクセスできるかどうかについては答えられていません。

getText()のようなLabelオブジェクトのメソッドへのアクセス方法については、他の方法も歓迎します。

+1

'((Label)event.getSource())。getText()'? (あなたが 'fx:id'を手に入れることができたとしても、それはどうやって 'getText()'を呼び出すのですか?) –

+0

考えてみたのはlabel1.getText()でした。 fx:idはlabel1なので、id .getText()の名前を使うことができると思いました。 でも、あなたのやり方はうまくいく。しかし答えはfx:idにアクセスすることはできませんが、その周りに道を見つける必要があります。ありがとう! – sandboxj

+1

しかし、 'label1'(これはオブジェクト参照)はありません。' label1 "というテキストを含む' String'変数があります。これはまったく同じものではありません。あなたは何をしますか? –

答えて

4

fx:idを入手することができたら、どうすればよいのかはっきりしません。 Labelを参照する変数の名前なので、Labelの一部ではありません。おそらく文字列になる名前を取得したとしても、あなたは何をしますか?

あなたが、その後Labelにそれをダウンキャストすることができ、event.getSource()とイベントのソースへの参照を取得し、あなたがだけLabel秒間ハンドラとして、このメソッドを登録してい仮定することができます

private void handleLabel(MouseEvent event) { 
    Label label = (Label) event.getSource(); 
    String labelText = label.getText(); 
    System.out.println("Mouse click on label: "+labelText); 
} 

一般に、このようなイベントのソースをチェックする単一のハンドラを使用するのではなく、各コントロールに対して異なるハンドラを持つ方がはるかに優れています。明らかにFXMLを使用している場合、これは非常に反復的になります(ただし、多数のコントロールがFXMLを使用している場合は既に繰り返しています)。 FXMLの代わりにJavaでこれを行う方が良いかもしれません(少なくともこれらのすべてのラベルを持つUIの部分)。そして、あなたは、コードを繰り返すことなく、それぞれに異なるハンドラを登録することができます

VBox lotsOfLabels = new VBox(); 
for (int i = 1 ; i <= 100; i++) { 
    Label label = new Label("Label "+i); 
    lotsOfLabels.getChildren().add(label); 
    label.setOnMouseClicked(e -> { 
     System.out.println("Mouse click on "+label.getText()); 
     // etc... 
    }); 
} 

あなたが(でもすべてでイベントハンドラを扱うなし)100枚のラベルを作成するためのFXMLにそのコードを比較すると、それが使用していることをかなり明確ですこのようなUIのJavaは、FXMLを使用するよりもはるかに簡単です。もちろん、同じことをしたVBoxのサブクラスを作成し、FXMLファイルでそのクラスを参照するだけで、残りの部分をFXMLで参照したい場合は、

関連する問題