I am trying to figure-out why parent element is always null
in following JavaFX code.
MenuBar
is used as a child inside gl.fmxl (see above). MenuBar
is using controller called MenuController. Now when I hit MenuController
by clicking on a menu then @FXML protected VBox gl;
is always null
in GlController
here is how MenuBar component is created using menu_bar.fxml file below
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
Here is how I initialise the javaFX application
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();
}
}
I am hitting processCsvData
by clicking on menu to debug the value of glController.getScene()
which is always null