JavaFX Nested Controllers (FXML <包括>)

2022-09-01 13:07:27

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

main_window_content.fxml

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

主控制器.java

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

    ..

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

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>

主控制器.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(); 
}

答案 1

感谢Daniel(来自OTN),我发现我的代码中有错误,我的控制器变量的名称是错误的。它们应该是 .换句话说,它应该是:<fx:id>Controller

主控制器.java

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

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

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

我希望对您有所帮助


答案 2

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

@FXML private DialogController dialog1Controller;

在这种情况下,行手动进入主控制器,然后它正常工作。对于组织大型fxmls/控制器非常有用。