【问题标题】:javafx how to reuse custom component in different FXMLjavafx如何在不同的FXML中重用自定义组件
【发布时间】:2016-05-09 16:06:17
【问题描述】:

经过几次搜索,我可以找到任何解决方案,并想寻求帮助。提前致谢。

我有一个带有 HBox 的 FXML,带有几个按钮(新建、显示、编辑)。每个按钮都有 onAction 方法。它用于其他 2 个 FXML (A & B),我想重用这样的 HBox。

其他 2 个 FXML(A,B)有一些控件(tableview,...)

这是我尝试过的:

1) 不能选择导入 HBox FXML,因为必须在所有 FXML (a & b) 中执行更改。

2) 包括使用 fx:id:我将有一个专用于 HBox 的控制器,我希望在 A、B 控制器上拥有控件和方法。

3) 包括使用 fx:root:我认为这是实现此目的的方法,但我有错误。

Navigation.fxml 文件:

<fx:root spacing="5.0" type="HBox" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
    <children>
        <Button fx:id="btnOpen" mnemonicParsing="false" onAction="#onActionOpen" text="Open" />
        <Button fx:id="btnSave" layoutX="10.0" layoutY="10.0" mnemonicParsing="false" onAction="#onActionSave" text="Save" />
        <Separator visible="false" HBox.hgrow="ALWAYS" />
        <Button fx:id="btnClose" layoutX="62.0" layoutY="10.0" mnemonicParsing="false" onAction="#onActionClose" text="Close" />
    </children>
    <padding>
        <Insets bottom="5.0" left="5.0" right="5.0" top="5.0" />
    </padding>
</fx:root>

Pane1controller.java:

public Pane1Controller() {
        System.out.println("Pane1_Controller");
        NavigationController nav = new NavigationController();
        System.out.println("NavigationController ... done");

        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("pane1.fxml"));
        System.out.println("setting root");        
        fxmlLoader.setRoot(this);
        System.out.println("setting controller");
        fxmlLoader.setController(this);

        try {
            System.out.println("loading fxml");
            pnlMain = fxmlLoader.load();
            System.out.println("done");
        } catch (IOException exception) {
            System.out.println("exception");
            pnlMain = null;
            throw new RuntimeException(exception);
        }
        System.out.println("done");

    } ...
}
  • 使用 setRoot ....

    原因:java.lang.RuntimeException: javafx.fxml.LoadException: Root 值已指定。 文件:/C:/Users/ecejdap/data/DEV/dev.java.nb/Testfx_fxroot/dist/run573616745/Testfx_fxroot.jar!/testfx_fxroot/pane1.fxml

  • 删除 setroot 引起:java.lang.RuntimeException:javafx.fxml.LoadException:已指定根值。 文件:/C:/Users/ecejdap/data/DEV/dev.java.nb/Testfx_fxroot/dist/run2127482879/Testfx_fxroot.jar!/testfx_fxroot/Navigation.fxml

实现这一目标的正确方法是什么?

感谢您的支持。 BR

【问题讨论】:

    标签: javafx-8


    【解决方案1】:

    这一定是由于&lt;fx:root&gt;标签引起的 我为上述任务创建了一个示例项目。访问GitHub 了解该项目。克隆它并参考。我想你可以理解。 Link

    【讨论】:

    • 感谢您的回答。我要测试...当我打开 sample.fxml 时,我看不到可重用组件(child.fxml),我想看到所有组件(本地和可重用)的最终示例
    • 只看Controller.java。我已经通过 Controller.java 将 child.fxml 窗格添加到 sample.fxml 的 HBox
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 2013-11-04
    • 2020-07-24
    • 2023-04-08
    • 1970-01-01
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多