3

どこでも、fx:rootの使用とプログラムによるルートノードの設定に関連するFXMLLoader#setController()の使用に関する説明があります(Oracle DocsSOの両方の回答にこのパターンがあります)。それは要件ですか?または、古き良きコンテナーを使用して通常のFXML(おそらくSceneBuilderを使用)を作成し、後でプログラムでコントローラーのみを設定できますか?

FXMLの場合:

<BorderPane fx:id="root" prefHeight="500.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" > </Borderpane>

一部のコード(おそらくコントローラー)では:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml_example2.fxml"));
fxmlLoader.setController(this);
try {
    fxmlLoader.load();            
} catch (IOException exception) {
    throw new RuntimeException(exception);
}
4

1 に答える 1

6

それは必須ではないと思います。OracleチュートリアルコードをApplicationクラスで次のように調整することで、これを機能させることができます。

@Override
public void start(Stage stage) throws Exception {

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml_example.fxml"));
    fxmlLoader.setController(new ExampleController());
    Parent root = (Parent)fxmlLoader.load();

    stage.setTitle("FXML Welcome");
    stage.setScene(new Scene(root, 300, 275));
    stage.show();
}

fx:controller="ExampleController"ご覧のとおり、FXMLでを使用するのではなく、プログラムでExampleControllerを設定id:rootしました。これを行うために、どこにも設定する必要はありませんでした。

余談ですが、このアプローチは、MVVMでWPFを使用してデータコンテキストをより厳密に設定することを模倣し、ビューをコントローラーからさらに分離するため、非常に気に入っています。

于 2013-01-15T16:07:19.910 に答える