Родительский элемент FXML не введен в дочерний контроллер

Я пытаюсь понять, почему родительский элемент всегда null в следующем коде JavaFX. MenuBar используется как дочерний элемент внутри gl.fmxl (см. выше). MenuBar использует контроллер под названием MenuController. Теперь, когда я нажимаю MenuController, щелкая меню, @FXML protected VBox gl; всегда становится null в GlController.

вот как создается компонент MenuBar с использованием файла menu_bar.fxml ниже

public class MenuBar extends FlowPane {

    public MenuBar(){
        FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fragments/top_menu.fxml"));
        fxmlLoader.setRoot(this);
        fxmlLoader.setController(new MenuController());
        try {
            fxmlLoader.load();
        } catch (IOException exception) {
            throw new RuntimeException(exception);
        }
    }
}

gl.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import javafx.scene.layout.*?>
<?import com.ui.layouts.MenuBar?>
<?import javafx.scene.control.Button?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1"
            fx:controller="com.ui.controllers.GlController">

    <VBox fx:id="gl">
        <MenuBar fx:id="menuBar"></MenuBar>
    </VBox>
</AnchorPane>

top_menu.fxml

<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.FlowPane?>

<fx:root type="javafx.scene.layout.FlowPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity"
          minWidth="-Infinity" xmlns:fx="http://javafx.com/fxml">
   <children>
       <MenuBar >
           <menus>
               <Menu mnemonicParsing="false" text="File">
                   <items>
                       <MenuItem fx:id="createCsvFile" mnemonicParsing="false" onAction="#exportCsvData" text="GL" />
                   </items>
               </Menu>
               <Menu mnemonicParsing="false" text="CSV">
                   <items>
                       <MenuItem fx:id="openCsvFile" mnemonicParsing="false" onAction="#processCsvData" text="open" />
                   </items>
               </Menu>
               <Menu mnemonicParsing="false" text="Products">
                   <items>
                       <MenuItem mnemonicParsing="false" onAction="#showProducts" text="saving" />
                   </items>
               </Menu>
               <Menu mnemonicParsing="false" text="Accounts">
                   <items>
                       <MenuItem mnemonicParsing="false" onAction="#showAccountTransactions" text="show" />
                   </items>
               </Menu>
           </menus>
       </MenuBar>
   </children>
</fx:root>

Main.java

Вот как я инициализирую приложение javaFX

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
      FXMLLoader fxmlLoader = new FXMLLoader();
    Parent parentView  = fxmlLoader.load(getClass().getResource("ui/layouts/gl.fxml"));
    primaryStage.setScene(new Scene(parentView, 1200, 800));
    primaryStage.show();

    }


    public static void main(String[] args) {
        launch(args);
    }
}

MenuController.java

public class MenuController {

    GlController glController = new GlController();

    @FXML protected void processCsvData(ActionEvent event) throws IOException {

        MenuItem menuItem = (MenuItem)event.getSource();
        if (menuItem.getId().equals(openCsvFile.getId())) {
            File file = browseFile("CSV", "*.csv");
            String csvData = buildCsv(file.getPath()).toString();
            List<Transactionable> transactionList = glToCsv.buildTransactions(csvData, TransactionType.ACTUAL_TRANSACTION);
            addTableItem(transactionTableView, transactionList);
        }
    }

}

GlController

public class GlController {

    @FXML protected VBox gl;

    public Scene getScene(){
        return gl.getScene();
    }
}

Я нажимаю processCsvData, щелкнув меню, чтобы отладить значение glController.getScene(), которое всегда равно null.


person amjad    schedule 09.01.2017    source источник
comment
Как это проверить? Вы никогда не получаете ссылку на класс GlController и, похоже, не используете никаких обработчиков событий или метод initialize...   -  person fabian    schedule 09.01.2017
comment
@fabian Я тестирую, нажимая menuController. Когда я отлаживаю значение glController.gl всегда равно null   -  person amjad    schedule 09.01.2017
comment
Я переместил GlController glController = new GlController(); внутрь класса MenuController, так как это похоже на то, что вы делаете, вместо того, чтобы объявлять его перед классом, что приведет к ошибке времени компиляции, поскольку это не похоже на внутренний класс MenuBar.   -  person fabian    schedule 09.01.2017