Javaで書かれたコントローラクラスの横にFXMLを使用するJavaFXアプリケーションがあります。 Javaコントローラでは、FXML Node
要素が初期化されるまで(それ以外の場合はNullPointerExceptionが発生するまで)操作しないように注意する必要があります。これはinitialize
メソッドが実行されるまで保証されません。FXML: "初期化後に実行"
コントローラは、このようFXMLファイルに設定されています:
<Pane fx:controller="Controller" ...>
...
</Pane>
そしてここJavaファイルのコントローラだだから私は自分自身は、この多くのことをやって見つけます。
class Controller{
@FXML
Pane aPane;
int globalValue;
public void setSomething(int value){
globalValue = value;
if(!(aPane == null)){ //possibly null if node not initialized yet
aPane.someMethod(globalValue)
}
}
@FXML
void initialize(){
aPane.someMethod(globalValue) //guaranteed not null at this point
}
}
これは機能しますが、ぎこちない繰り返しです。 initialize
が呼び出される前にsetSomething
メソッドが呼び出された場合のためにglobalValue
属性を作成する必要があります。メソッドの操作がinitialize
の操作と同じであることを確認する必要があります。
確かにこれを行うためのよりエレガントな方法があります。 JavaFXにはPlatform.runlater(...)
メソッドがあり、何かがメインのアプリケーションスレッド上で実行されることが保証されています。 Perhpasには、初期化まで待つか、または初期化がすでに行われていればすぐに実行されるようなものがあります(Platform.runAfterInitialize(...)
)。それを行う別の方法がある場合は、私は提案に開放しています。
をあなたが設定されています:単に
FXMLLoader
にコントローラを渡す前に、コントローラ上のset
メソッドを呼び出して回避することで、任意の@FXML
-annotatedフィールドは、コントローラのパブリックメソッドで初期化されていると仮定できることを意味しますコードからの 'FXMLLoader'のコントローラ?そうでない場合は、 'FXMLLoader'によって' initialize() 'が呼び出される前に' setSomething(...) 'を呼び出す方法がありません。もう少し文脈を与えることができますか? –私はquesitonにいくつかの説明を加えました。私は最初に 'FXMLLoader'を作成していて、' setController'メソッドを使ってこの問題を発見しました。今私はコントローラにアクセスするために '@ FXML'で注釈が付けられた収容クラスの' Controller'オブジェクトを使用しています。そのようにしたらこの問題は存在しませんか? –
回答を参照してください。 'fx:controller'を使うと、インスタンス化と' @ FXML'-annotatedフィールドの間でコントローラインスタンスにアクセスする方法がありません。 –