Я пытаюсь понять, почему родительский элемент всегда 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
.
GlController
и, похоже, не используете никаких обработчиков событий или методinitialize
... - person fabian   schedule 09.01.2017GlController glController = new GlController();
внутрь классаMenuController
, так как это похоже на то, что вы делаете, вместо того, чтобы объявлять его перед классом, что приведет к ошибке времени компиляции, поскольку это не похоже на внутренний классMenuBar
. - person fabian   schedule 09.01.2017