メイン アプリケーションまたは他のステージから画面上の情報を更新するために、いつでも FXML コントローラ クラスと通信したいと考えています。
これは可能ですか?私はそれを行う方法を見つけていません。
静的関数は方法になる可能性がありますが、フォームのコントロールにアクセスできません。
何か案は?
からコントローラを取得できます。FXMLLoader
FXMLLoader fxmlLoader = new FXMLLoader();
Pane p = fxmlLoader.load(getClass().getResource("foo.fxml").openStream());
FooController fooController = (FooController) fxmlLoader.getController();
メインステージに保存し、 getFooController() getter メソッドを提供します。
他のクラスまたはステージから、ロードされた「foo.fxml」ページを更新する必要があるたびに、コントローラーから要求します。
getFooController().updatePage(strData);
updatePage() は次のようになります。
// ...
@FXML private Label lblData;
// ...
public void updatePage(String data){
lblData.setText(data);
}
// ...
FooController クラスで。
このようにして、他のページのユーザーは、何がどこにあるかなどのページの内部構造について気にしませんLabel lblData
。
https://stackoverflow.com/a/10718683/682495も見てください。JavaFX 2.2FXMLLoader
では改善されています。
別の解決策は、コントローラークラスからコントローラーを設定することです...
public class Controller implements javafx.fxml.Initializable {
@Override
public void initialize(URL location, ResourceBundle resources) {
// Implementing the Initializable interface means that this method
// will be called when the controller instance is created
App.setController(this);
}
}
ローカル リソースなどを適切に処理する完全に機能する FXMLLoader インスタンスを作成するには、コードがやや面倒なので、これは私が使用することを好むソリューションです。
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("/sample.fxml"));
}
対
@Override
public void start(Stage stage) throws Exception {
URL location = getClass().getResource("/sample.fxml");
FXMLLoader loader = createFXMLLoader(location);
Parent root = loader.load(location.openStream());
}
public FXMLLoader createFXMLLoader(URL location) {
return new FXMLLoader(location, null, new JavaFXBuilderFactory(), null, Charset.forName(FXMLLoader.DEFAULT_CHARSET_NAME));
}
メイン画面からのオブジェクトの読み込みで、見つけて動作するデータを渡す 1 つの方法は、ルックアップを使用して、後でコントローラー クラスから取得できる非表示のラベル内にデータを設定することです。このような:
Parent root = FXMLLoader.load(me.getClass().getResource("Form.fxml"));
Label lblData = (Label) root.lookup("#lblData");
if (lblData!=null) lblData.setText(strData);
これは機能しますが、もっと良い方法があるはずです。