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());
そして、それは誤ったです。正確には、fieldRegisterUsername
はnull
です。
lookup(String id)
メソッドではいくつかの要素が見つかり、@FXML
アノテーションでは検出されないのはなぜですか?
通常、異なるFXML(ビュー)のコントローラを共有するのはお勧めできません。私は特にあなたがJavaFXで始めるのであれば、それに反対して助言したいと思います。[この質問](http://stackoverflow.com/questions/17914254/javafx-multiple-fxml-and-1-shared-controller)を見てください。 – Itai
それは議論の余地があります、多くの開発者がこの方法を使用し、同じ番号がagianstです。個人的には、2つの小さなシーンの場合には、共有コントローラの悪いことは何も見ません。私は前にリンクされた質問を読んだが、それは忍耐の必要性と矛盾している。 –
「永続性の必要性」の意味を理解しています。あなたのケースで 'lookup'がなぜ機能したのかについては、私の答えを見てください。 'FXMLLoader'のためにコントローラを設定しない限り、' load'を呼び出すたびにコントローラクラスの新しいインスタンスが作成されることに注意してください。 – Itai