web-dev-qa-db-ja.com

JavaFxネストされたコントローラー(FXML <include>)

this tutotialには、カスタムコンポーネントを含め、コンテナのコントローラーからコントローラーを使用する方法の例があります。

main_window_content.fxml

<VBox fx:controller="com.foo.MainController">
   <fx:include fx:id="dialog" source="dialog.fxml"/>
   ...
</VBox>

MainController.Java

public class MainController extends Controller {
    @FXML private Window dialog;
    @FXML private DialogController dialogController;

    ..

コンポーネントが1回だけ含まれている場合は、正常に機能します。同じコンポーネントが2回含まれている場合、コントローラーは初期化されません。両方のコントローラーがヌルです。

main_window_content.fxml

    <VBox fx:controller="com.foo.MainController">
       <fx:include fx:id="dialog1" source="dialog.fxml"/>
       <fx:include fx:id="dialog2" source="dialog.fxml"/>
       ...
    </VBox>

MainController.Java

    public class MainController extends Controller {
        @FXML private Window dialog1;
        @FXML private DialogController dialogController1;
        @FXML private Window dialog2;
        @FXML private DialogController dialogController2;

誰かが問題を解決するのを手伝ってくれますか?ありがとう

これは私のFXMLロードコードです。メインアプリケーションメソッドで実行されます。

public void start(Stage stage) throws Exception { 
    Parent root = FXMLLoader.load(getClass().getResource("main_window_content.fxml"));
    stage.setTitle("FXML Welcome"); 
    stage.setScene(new Scene(root, 300, 275));
    stage.show(); 
}
27
Antonello

Daniel(OTN)のおかげで、コードにエラーが見つかりました。コントローラー変数の名前が間違っていました。それらは<fx:id>Controllerでなければなりません。つまり、次のようになります。

MainController.Java

public class MainController extends Controller {
@FXML private Window dialog1;
@FXML private DialogController dialog1Controller;
@FXML private Window dialog2;
@FXML private DialogController dialog2Controller;

しかし、バージョン2.2で導入された changes を調べると、<fx:root>タグを使用することですべてを簡単に解決できることがわかりました( このチュートリアルのように )。次のように宣言するだけで、FXMLにコンポーネントを入力しました。

<HBox>
    <Dialog id="dialog1" text="Hello World!"/>
    <Dialog id="dialog2" text="Hello World!"/>
</HBox>

役立つことを願っています

36
Antonello

ネストされたfxmlsを使用したnetbeans 8.0にもバグがあるようです。ネストされたfxmlのコントローラーオブジェクトを作成するためにnetbeansを使用することはできません。MainControllerに手動で挿入する必要があります。 netbeansでコントローラーが更新されるたびに、コントローラーは消去されるため、面倒な作業になります。この例では、

@FXML private DialogController dialog1Controller;

この場合、メインコントローラーに手動で入力すると、正常に機能します。大規模なfxml /コントローラを整理するのに非常に便利です。

2
SamHuman