2016-11-21 28 views
0

アノテーションを使用して初期化できるJavafx 8を使用してカスタムボタンを作成したいとします。 ボタンの初期化では、FXML注釈だけが表示されました。 注釈を使用してカスタムボタンを作成するにはどうすればよいですか?javafxカスタムコントロールにアノテーションを追加

注釈:

@Retention(RetentionPolicy.RUNTIME) 
@Target(ElementType.FIELD) 
public @interface Anno { 

String someAction(); 

String someValue(); 
} 

クラスのコンストラクタ:

public CustomButton() { 
    super(); 
    if (this.getClass().isAnnotationPresent(Anno.class)) { 
     Anno anno = this.getClass().getAnnotation(Anno.class); 
     setAction(anno.someAction()); 
     setValue(anno.someValue()); 
    } 
    initialize(); 
} 

カスタムボタンの呼び出し:

@FXML 
@Anno(someAction = "someAction", someValue = "Hello") 
private CustomButton button; 

はそうする方法はありますか?

+2

'Anno'はフィールド注釈ですので、this.getClass()。isAnnotationPresent(Anno.class)'はそれを返しません。アノテーション値は、フィールドを取得することによって、包含クラスで取り出すことができます。 – DVarga

+0

@DVargaあなたは何を変えるべきですか? – Zoltanik

答えて

0

これでやりたいことはできないと思います。 CustomButtonのコンストラクタは、割り当てられているフィールドではなくCustomButtonクラスの注釈を探しています。つまり、正しい注釈が見つからないことを意味します。そして、私が知る限り、この問題を解決するためのコンストラクタ呼び出しからコントローラインスタンスとフィールド参照を取得する簡単な方法はありません。

this tutorialに従うと、.fxmlファイルでこれらのフィールドを設定することができます。

+0

まずはお返事いただきありがとうございますが、私はすでにこれらのフィールドを設定しています。fxmlファイルではなく、fxmlからcustomButtonを初期化する別の方法が必要です – Zoltanik

+0

javafxが初期化した後でそのフィールドを変更する方法を見つけ出す必要があるよりも、おそらく最も簡単な方法は、 'initialize()'メソッドからの呼び出しを使用して、インスタンスとフィールド名を(もしあれば)注釈を処理するメソッドに渡すことです。なぜなら、私が知っている限り、 javafxコントローラのプロセス。 – n247s

0

独自のアノテーションを作成する必要はありません。 reflexionを使うことは役に立たず、複雑になるでしょう。

質問に直接答えるには、アノテーションがフィールドレベルであり、タイプレベルではないため、「アノ」アノテーションインスタンスを取得できません。

重要なことは、ボタンの値をFXMLファイルまたはコントローラで初期化する必要があることです。

あなたがオラクルからのチュートリアルを参照することもできます。ただ、FXML

でボタンを宣言

<Button fx:id="myButton" text="a text" onAction="#myAction"/> 

またはコントローラ

の等価:FXMLでそう https://blogs.oracle.com/jmxetc/entry/connecting_scenebuilder_edited_fxml_to

<Button fx:id="myButton" /> 

次に、彼コントローラ

public class MyController 

    @FXML Button myButton; 

@FXML 
public void initialize(){ 
    myButton.setText("a text") 
    myButton.setOnAction(this::myAction); 
} 

編集中のアクション:あなたの難しさがここにある場合は、あなたの質問には、「カスタム」コンポーネントについてでした、E(FX)ザ・クリプスプラグインを使用してゲッター/セッターを生成し、あなたはJavaFXのプロパティを追加することもできます、またはFXML /コントローラの両方で同じ方法でアクセスできます。これについてさらに詳しく知りたい場合は、私に知らせてください。

関連する問題