2016-06-12 12 views
0

JavaFX FXMLアプリケーション技術の調査を開始します。JavaFX FXMLへのアクセスはlookup()メソッドで成功しますが、@FXMLアノテーションでは成功しません。

私はメインクラスでアクセスされた1つのメインステージを、Main.getStage()でオーバーライドされたメソッドpublic void start(Stage stage)で起動します。中に2つのpublic static Sceneを入れて、それらを切り替えながら永続性を保つ。

@Override 
public void start(Stage stage) throws Exception { 
    STAGE = stage; 
    LOGIN = new Scene(FXMLLoader.load(getClass().getResource("Login.fxml"))); 
    REGISTER = new Scene(FXMLLoader.load(getClass().getResource("Register.fxml"))); 

    STAGE.setScene(LOGIN); 
    STAGE.setTitle("FXApplication"); 
    STAGE.show(); 
} 

public static Stage getStage() { 
    return STAGE; 
} 

両方のシーンに同じコントローラークラスMainControllerがあります。使い方:

  • ボタンをfx:id="buttonLoginRegister"ではLOGIN 1に戻ってfx:id="buttonRegisterBack"REGISTERシーン
  • ボタンに移動します。

であり、両方とも同じonClickイベントhandleButtonAction(ActionEvent event)を有する。 TextFieldsは、ユーザ名がログイン/登録するためのフィールドです。

​​

私の目標は、REGISTERシーンの1にLOGINテキストフィールドから値をコピーすることです。上記のコードを使用するとうまくいきます。しかし、最初に私は別のシーン内の要素にアクセスしようとしました:

fieldRegisterUsername.setText(fieldLoginUsername.getText()); 

そして、それは誤ったです。正確には、fieldRegisterUsernamenullです。

lookup(String id)メソッドではいくつかの要素が見つかり、@FXMLアノテーションでは検出されないのはなぜですか?

+0

通常、異なるFXML(ビュー)のコントローラを共有するのはお勧めできません。私は特にあなたがJavaFXで始めるのであれば、それに反対して助言したいと思います。[この質問](http://stackoverflow.com/questions/17914254/javafx-multiple-fxml-and-1-shared-controller)を見てください。 – Itai

+0

それは議論の余地があります、多くの開発者がこの方法を使用し、同じ番号がagianstです。個人的には、2つの小さなシーンの場合には、共有コントローラの悪いことは何も見ません。私は前にリンクされた質問を読んだが、それは忍耐の必要性と矛盾している。 –

+0

「永続性の必要性」の意味を理解しています。あなたのケースで 'lookup'がなぜ機能したのかについては、私の答えを見てください。 'FXMLLoader'のためにコントローラを設定しない限り、' load'を呼び出すたびにコントローラクラスの新しいインスタンスが作成されることに注意してください。 – Itai

答えて

2

私のコメントで述べたように、異なるビュー間でコントローラを共有することはめったに良いことではありません。それぞれのビューに対して別々のコントローラを作成することを強くお勧めします。

問題自体については、コントローラークラスのインスタンスが2つあります。これは、FXMLLoader.loadを呼び出すたびに1つです。おそらく、一方のビューにはfieldLoginUsernameのTextFieldがあり、もう一方のビューにはfieldRegisterUsernameがあります。
ifステートメントの条件が満たされている場合は、アクティブなシーンがログインシーンであることを意味します。コントローラを処理するコントローラはfieldLoginUsernameであるため、当然fieldRegisterUsernameはnullになります。

しかし、あなたはそう、あなたがそのコントローラレジスタコントローラ、fieldRegisterUsernameを持っているものですシーンを参照しているscene#lookup呼び出し時間によって、登録1にアクティブなシーンを変更if句内の最初の行に。

アクティブなシーンを変更する前にscene#lookupに電話すると、nullも返されます。

コントローラーに同じクラスを使用する必要がある場合は、そのクラスのインスタンスが1つだけあることを確認してください。それはFXMLLoader#setControllerを使用する必要があります。

+0

ありがとうございます。異なるScanes間で1つのコントローラを使用することが悪い考えであれば、2つの分離されたコントローラを使用して同じ効果を達成する方法を教えてください。私は値を簡単に渡すことは考えていません。 –

+0

Arjanは、元の質問に対するコメントで2つの優れた回答を結びつけました。 – Itai

関連する問題