javafx如何在不同的FXML中重用自定义组件

时间:2016-05-09 16:06:18

标签: javafx-8

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

我有一个带有HBox的FXML,带有几个按钮(new,show,edit)。每个按钮都有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

1 个答案:

答案 0 :(得分:0)

这必须是由<fx:root>标记引起的 我已经为上述任务创建了一个示例项目。访问QHeaderView::setSectionResizeMode项目。克隆它并参考。我想你可以理解它。 GitHub