28

教程中,是一个示例,说明如何包含自定义组件并从容器的控制器中使用它们的控制器。

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(); 
}
4

2 回答 2

40

感谢 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 版本中引入的更改<fx:root>,我发现使用标签可以轻松解决所有问题(就像本教程一样)。我在 FXML 中输入了我的组件,只是像这样声明它:

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

我希望能有所帮助

于 2012-09-24T20:31:21.007 回答
2

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

@FXML private DialogController dialog1Controller;

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

于 2014-06-24T13:22:19.147 回答