2016-05-09 4 views
0

После нескольких поисков я могу найти любое решение для этого и хотел бы попросить о помощи. Заранее спасибо.javafx как повторно использовать пользовательский компонент в разных FXML

У меня есть FXML с HBox с несколькими кнопками (новый, показать, редактировать). Каждая кнопка имеет метод 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: Значение корня уже указано. файл:/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

ответ

0

Это должно быть вызвано тегом <fx:root> Я создал образец проекта для вышеуказанной задачи. Зайдите в проект GitHub. Клонировать и ссылаться. Я думаю, вы можете это понять. Link

+0

Спасибо за ваш ответ. Я собираюсь проверить ... Когда я открываю sample.fxml, я не вижу компонент многократного использования (child.fxml), и я хочу видеть окончательный образец со всеми компонентами (локальными и многократно используемыми) – ecejuan

+0

Просто посмотрите Controller.java. Я добавил панель child.fxml в HBox sample.fxml через Controller.java – jayaneetha

Смежные вопросы