JavaFx嵌套控制器(FXML )

JavaFx Nested Controllers (FXML )

在本教程中,是一个如何包含自定义组件以及如何使用容器控制器中的控制器的示例。

main_window_content.fxml

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

MainController.java

1
2
3
4
5
public class MainController extends Controller {
    @FXML private Window dialog;
    @FXML private DialogController dialogController;

    ..

如果该组件仅包含一次,则工作正常。
如果两次包含同一组件,则不会初始化控制器。
两个控制器均为空。

main_window_content.fxml

1
2
3
4
5
    <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

1
2
3
4
5
    public class MainController extends Controller {
        @FXML private Window dialog1;
        @FXML private DialogController dialogController1;
        @FXML private Window dialog2;
        @FXML private DialogController dialogController2;

有人可以帮我解决问题吗?
谢谢

这是我的FXML加载代码。 它以主要应用程序方法执行:

1
2
3
4
5
6
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();
}


多亏了OTN的Daniel(我来自OTN),我在代码中发现了错误,我的控制器变量名称错误。 它们应该是Controller
换句话说,它应该是:

MainController.java

1
2
3
4
5
public class MainController extends Controller {
@FXML private Window dialog1;
@FXML private DialogController dialog1Controller;
@FXML private Window dialog2;
@FXML private DialogController dialog2Controller;

但是研究2.2版中引入的更改后,我发现可以使用标记轻松解决所有问题
(例如本教程)。
我在FXML中输入了我的组件,只是像这样声明它:

1
2
3
4
<HBox>
    <Dialog id="dialog1" text="Hello World!"/>
    <Dialog id="dialog2" text="Hello World!"/>
</HBox>

希望对您有所帮助


带有嵌套fxml的netbeans 8.0中似乎也存在一个错误。 无法依靠netbeans为您创建嵌套的fxml的控制器对象,必须将其手动插入到MainController中。 每次在netbeans中更新控制器时,它都会被清除掉,因此可能有点乏味。
对于此示例,将插入

1
@FXML private DialogController dialog1Controller;

在这种情况下,手动将线路连接到主控制器中,然后它将正常工作。 对于组织大型fxml /控制器非常有用。