JavaFX: корневое значение уже указано

Я хочу изменить центр пограничной области, когда я нажимаю меню, но появляется ошибка «Корневое значение уже указано». Сначала я инициализирую его, как показано ниже.

@Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        currentMenuNum = 0;
        currentMenu = menuList[currentMenuNum];
        currentViewerPath = "/managerworld/viewer/StartViewer.fxml"; 
        System.out.println(currentMenu);
        setControlItems(currentViewerPath,currentMenu);

    }

private void setControlItems (String path, String currentMenu) {
        //Display setting for menu
        try {
            fxmlLoader.setLocation(getClass().getResource(path));
            anchorPane = fxmlLoader.load();
//            fxmlLoader.load();
            connectionViewerController = (ConnectionViewerController) fxmlLoader.getController();
        } catch (Exception e) {
            System.out.println(e.getStackTrace().toString());
            System.out.println(e.getMessage());
        }
        borderPane.setCenter(anchorPane);
        //controller setting
        if (currentMenu.equals(currentMenu)) connectionViewerController = (ConnectionViewerController) fxmlLoader.getController();
        else return;
        //button setting
        button2.setDisable(false);
        button3.setDisable(false);
        button4.setDisable(false);
        button5.setDisable(false);
    }

первая загрузка работает хорошо, но если я пытаюсь перезагрузить другой файл fxml, появляется ошибка.

@FXML
    private void handleSelectMenus(MouseEvent event) {
if (event.getSource().equals(menuVBox1)) {
            currentViewerPath = "/managerworld/viewer/ConnectionViewer.fxml";
            currentMenuNum = 1;
            currentMenu = menuList[currentMenuNum];
            setControlItems(currentViewerPath,currentMenu);
} else {
        }

    }

и мои файлы fxml такие..

 <AnchorPane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER">
         <children>
            <VBox alignment="CENTER" prefHeight="653.0" prefWidth="792.0" style="-fx-border-color: #D3D3D3;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
               <children>
                  <Text fill="#656565" strokeType="OUTSIDE" strokeWidth="0.0" text="Welcome to Manager World!">
                     <font>
                        <Font size="36.0" />
                     </font>
                  </Text>
                  <Text fill="#003975" layoutX="41.0" layoutY="329.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Click the Connection Menu to get started.">
                     <font>
                        <Font size="16.0" />
                     </font>
                  </Text>
               </children>
            </VBox>
         </children>
      </AnchorPane>

fxml, который включает пограничную панель, выглядит так..

<BorderPane fx:id="borderPane" maxHeight="768.0" maxWidth="1024.0" minHeight="768.0" minWidth="1024.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="managerworld.controller.ManagerWorldController">
          <center>
       </center>

и это то, что я хочу изменить, если я нажму на меню

<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="managerworld.controller.ConnectionViewerController">
         <children>
            <VBox spacing="5.0" style="-fx-border-color: #D3D3D3;" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
               <children>
                  <GridPane alignment="CENTER_LEFT" layoutX="100.0" layoutY="100.0" BorderPane.alignment="CENTER">

Кто-нибудь поможет мне с этой проблемой?


person James    schedule 22.11.2015    source источник
comment
Я сам решил эту проблему, добавив fxmlLoader.setRoot(null); это перед setLocation. Является ли это оптимальным способом решения этой проблемы?   -  person James    schedule 22.11.2015
comment
Каждый раз создавайте новый FXMLLoader вместо повторного использования одного и того же.   -  person James_D    schedule 22.11.2015
comment
Тогда в чем разница между тем, чтобы сделать fxmlloader нулевым, и каждый раз создавать новый?   -  person James    schedule 22.11.2015
comment
(Я предполагаю, что вы имеете в виду разницу между установкой root из FXMLLoader на null и созданием нового.) FXMLLoader имеет больше состояний, чем просто root, который может быть инициализирован только один раз: например, контроллер и т. д. Так что я думаю, что даже с установкой для корня значения null, если вы попытаетесь повторно использовать тот же fxmlLoader для загрузки файла FXML с атрибутом fx:controller, вы также получите сообщение об ошибке. Кроме того, fxmlLoader содержит ссылки на все атрибуты fx:id, и вам, вероятно, следует убедиться, что они очищены, чтобы избежать конфликтов. Гораздо безопаснее создать новый загрузчик.   -  person James_D    schedule 22.11.2015
comment
большое спасибо. поэтому я должен изменить свой код следующим образом.   -  person James    schedule 22.11.2015
comment
попробуйте { FXMLLoader fxmlLoader = новый FXMLLoader(); fxmlLoader.setLocation(getClass().getResource(путь));   -  person James    schedule 22.11.2015
comment
Да, это лучший способ сделать это.   -  person James_D    schedule 22.11.2015
comment
Спасибо за умный ответ.   -  person James    schedule 22.11.2015