78

メイン アプリケーションまたは他のステージから画面上の情報を更新するために、いつでも FXML コントローラ クラスと通信したいと考えています。

これは可能ですか?私はそれを行う方法を見つけていません。

静的関数は方法になる可能性がありますが、フォームのコントロールにアクセスできません。

何か案は?

4

4 に答える 4

115

からコントローラを取得できます。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では改善されています。

于 2012-05-25T11:01:34.240 に答える
8

別の解決策は、コントローラークラスからコントローラーを設定することです...

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));
}
于 2015-07-18T15:25:45.140 に答える
3

メイン画面からのオブジェクトの読み込みで、見つけて動作するデータを渡す 1 つの方法は、ルックアップを使用して、後でコントローラー クラスから取得できる非表示のラベル内にデータを設定することです。このような:

Parent root = FXMLLoader.load(me.getClass().getResource("Form.fxml"));
Label lblData = (Label) root.lookup("#lblData");
if (lblData!=null) lblData.setText(strData); 

これは機能しますが、もっと良い方法があるはずです。

于 2012-05-25T08:47:50.530 に答える