2017-10-09 5 views
0

私はjavaFxを初めて使用していますが、@fxml関数内でしか見つかりませんでした。関数を初期化すると、@fxmlフィールドはnullになりません。そうでなければ、@fxmlフィールドは常にnullになります。 はもしそうなら、私はちょうどこのようFXMLを(ルックアップを使用していない)、ロード直後@fxmlフィールドを使用することができますか?JavaFx- fxmlがオブジェクトフィールドを挿入するとき?

@FXML Label resultTF; 
    .... 
    FXMLLoader loader=new FXMLLoader(); 
    loader.setController(this); 

    Parent pane = loader.load(getClass().getResource("/fxml/Main.fxml")); 
    this.resultTF.setText(""); 

すべて私がしたい(コードのフォローがnull例外がスローされます) fxmlにidを持つフィールドを宣言し、wxfなどのfxmlをロードした直後に使用します。

+0

申し訳ありませんが、私はコードを編集しました – BlackCat

+0

今、何が起こるか知っています。私が呼び出すロードメソッドは静的メソッドです。非静的ロードと同じ名前なので、私はJavaがインスタンスからの静的メソッドを呼び出すことができると思うので、悪いデザインです:) – BlackCat

答えて

2

static FXMLLoader.load(URL)メソッドを呼び出しています。

これは静的メソッドなので、呼び出すために使用しているインスタンスについては何も知らない(とにかく悪い練習ですが、あなたのIDEはこれについて警告を出すべきです)。具体的には、コントローラセットはありません。

instance load() methodを呼び出す必要があります。

FXMLLoader loader=new FXMLLoader(); 
loader.setController(this); 
loader.setLocation(getClass().getResource("/fxml/Main.fxml")); 

Parent pane = loader.load(); 
+0

うわー、私はそれがオブジェクトメソッドと同じ名前を持っているので、それは静的メソッドであることに気付かなかった。 – BlackCat

+0

ありがとうございました – BlackCat

+0

@BlackCatはい、特に優れたAPIデザインではありません。しかし、私はあなたのIDEがこれにフラグを立てて、それを同等の 'FXMLLoader.load(getClass()。getResource(...)) 'に変更することを提案しなければならないと言いました。 –

-1

コントローラはFXMLファイルで指定できます。 FXMLLoaderはコントローラ内の変数を初期化します。その場合、コードに問題はありません。コントローラーをメインクラスから分離することをお勧めします。

+1

オペレータにはコントローラがメインクラスと同じであることが示唆されるものは何もありません。コントローラーからFXMLを読み込むパターンはたくさんあります。 https://docs.oracle.com/javase/9​​/docs/api/javafx/fxml/doc-files/introduction_to_fxml.html#custom_components –

+0

コードはその印象を与えています。 –

+0

どのようにそうですか?あなたはコードが "メインクラス"にあると仮定しなければなりません(本当にそうすべきではなく、メインクラスはアプリケーションのライフサイクルを管理すべきです)。 OPは彼がwpfやflexを模倣しようとしていると言っていますが、私はMVVM型のデザインを使う傾向があると思います(私はそれらの技術の専門家ではありません)。そのデザインでは、コントローラからビューをロードしたいと思うでしょう。 –

関連する問題