Ошибка в настройке Vbox внутри панели границ по центру при нажатии кнопки

Я разрабатываю приложение javafx, используя BorderPane в качестве Rootlayout внутри панели границы, слева есть кнопка. при щелчке которого мне нужно установить центр границы (rootlayout) на другой addprodct.fxml . Я хочу добавить vbox при нажатии кнопки «Вставить» внутри центра BorderPane.

Я проверил, загружается ли мой fxml правильно или нет, с помощью этого System.out.println("view folder: " + RootController.class.getResource("/Views/AddProduct.fxml")); его точного пути печати к fxml. я попытался установить этап с новым fxml, чтобы увидеть, правильно ли он загружается и работает ли он правильно.

        FXMLLoader loader = new FXMLLoader();
        System.out.println("view folder: " + RootController.class.getResource("/Views/AddProduct.fxml"));
        loader.setLocation(RootController.class.getResource( "/Views/AddProduct.fxml"));
        tryvbox = loader.load();
        main.getPrimaryStage().setScene(new Scene(tryvbox));

Да, я знаю, что такой же вопрос уже задавали, но я реализовал данное решение, которое не помогло моей проблеме. Загрузить новый fxml в центр пограничной панели

JavaFX: как обновить центральный вид пограничной панели с новыми значениями

Main.java


    package sample;

    import Controllers.RootController;
    import javafx.application.Application;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.scene.Scene;
    import javafx.scene.layout.BorderPane;
    import javafx.stage.Stage;
    import java.io.IOException;


    public class Main extends Application {
        @FXML
        private BorderPane rootLayout;
        private Stage  primaryStage;
        @Override
        public void start(Stage primaryStage) throws Exception{
            this.primaryStage = primaryStage;
            mainwindow();
        }
        public void mainwindow() throws IOException {
            FXMLLoader loader = new FXMLLoader();
            loader.setLocation(getClass().getResource("/Views/Rootlayout.fxml"));
            rootLayout = loader.load();

            RootController rootController = loader.getController();
            rootController.setMain(this);
            Scene scene= new Scene(rootLayout);
            primaryStage.setTitle("Inventory Manager");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
        public BorderPane getRootLayout() {
            return rootLayout;
        }

        public Stage getPrimaryStage() {
            return primaryStage;
        }

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

RootController.java

package Controllers;

import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import sample.Main;

import java.io.IOException;

public class RootController {
    @FXML
    private Button rootBtnInsrt;
    @FXML
    private Button rootBtnUpdate;
    @FXML
    private BorderPane rootLayout;
    private Main main;

    public void setMain(Main main) {
        this.main = main;
    }

    @FXML
    void btnInsrtClick(MouseEvent event) {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(RootController.class.getResource( "/Views/AddProduct.fxml"));
        try {
            VBox addProduct1 = loader.load();
        } catch (IOException e) {
            e.printStackTrace();
        }

        AddProductController addProductController= loader.getController();
        addProductController.setMain(main);
        main.getRootLayout().setCenter(rootLayout);
    }
}

rootlayout.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Menu?>
<?import javafx.scene.control.MenuBar?>
<?import javafx.scene.control.MenuItem?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>

<BorderPane fx:id="rootLayout" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Controllers.RootController">
   <top>
      <MenuBar prefHeight="21.0" prefWidth="600.0" BorderPane.alignment="CENTER">
        <menus>
          <Menu mnemonicParsing="false" text="File">
            <items>
              <MenuItem mnemonicParsing="false" text="Close" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Edit">
            <items>
              <MenuItem mnemonicParsing="false" text="Delete" />
            </items>
          </Menu>
          <Menu mnemonicParsing="false" text="Help">
            <items>
              <MenuItem mnemonicParsing="false" text="About" />
            </items>
          </Menu>
        </menus>
      </MenuBar>
   </top>
   <bottom>
      <AnchorPane prefHeight="29.0" prefWidth="600.0" style="-fx-background-color: Black;" BorderPane.alignment="CENTER" />
   </bottom>
   <left>
      <VBox alignment="CENTER" prefHeight="345.0" prefWidth="164.0" spacing="20.0" BorderPane.alignment="CENTER">
         <children>
            <Button fx:id="rootBtnInsrt" mnemonicParsing="false" onMouseClicked="#btnInsrtClick" prefHeight="50.0" prefWidth="132.0" text="Insert " />
            <Button fx:id="rootBtnUpdate" mnemonicParsing="false" onMouseClicked="#btnUpdateClick" prefHeight="50.0" prefWidth="135.0" text="Update" />
            <Button mnemonicParsing="false" prefHeight="50.0" prefWidth="158.0" text="View" />
         </children>
         <padding>
            <Insets left="10.0" right="10.0" />
         </padding>
      </VBox>
   </left>
</BorderPane>

Добавитьпродукт.fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>

<VBox fx:id="addproduct" alignment="CENTER" prefHeight="249.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label alignment="CENTER" text="Add Product" VBox.vgrow="ALWAYS" />
      <GridPane VBox.vgrow="ALWAYS">
         <columnConstraints>
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" />
         </columnConstraints>
         <rowConstraints>
            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" vgrow="SOMETIMES" />
         </rowConstraints>
         <children>
            <Label text="Product Code" />
            <Label text="Product Name :" GridPane.rowIndex="1" />
            <Label text="Product Price :" GridPane.rowIndex="2" />
            <Label text="Product Quantity :" GridPane.rowIndex="3" />
            <TextField GridPane.columnIndex="1" />
            <TextField GridPane.columnIndex="1" GridPane.rowIndex="1" />
            <TextField GridPane.columnIndex="1" GridPane.rowIndex="2" />
            <TextField GridPane.columnIndex="1" GridPane.rowIndex="3" />
         </children>
         <padding>
            <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" />
         </padding>
      </GridPane>
      <HBox alignment="CENTER" spacing="30.0">
         <children>
          <Button alignment="CENTER" maxHeight="40.0" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="ADD" HBox.hgrow="ALWAYS" />
            <Button alignment="CENTER" maxHeight="40.0" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Reset" HBox.hgrow="ALWAYS" />
            <Button maxHeight="40.0" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Back" HBox.hgrow="ALWAYS" />
         </children>
         <padding>
            <Insets bottom="20.0" left="20.0" right="20.0" />
         </padding>
      </HBox>
   </children>
</VBox>

при попытке запустить следующий код я получаю сообщение об ошибке.

  1. Исключение в потоке «Поток приложения JavaFX» java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
  2. Вызвано: java.lang.reflect.InvocationTargetException
  3. Вызвано: java.lang.NullPointerException

все в той же панели ошибок, это моя структура каталогов. Структура каталогов


person DarkSource    schedule 16.07.2019    source источник
comment
извините, что код для корневого контроллера был опубликован дважды. но у него тоже был fx:id assign   -  person DarkSource    schedule 17.07.2019
comment
я проверил, загружены ли файлы или нет, используя System.out.println (просмотр папки: + RootController.class.getResource (/Views/AddProduct.fxml)); который печатается следующим образом: папка просмотра: файл:/C:/Users/***/IdeaProjects/Management/out/production/Management/Views/AddProduct.fxml также преобразовала мою папку Views в ресурсы, но ни один из них не работал   -  person DarkSource    schedule 17.07.2019
comment
проблема в моей структуре каталогов или это мой код. Я попытался поместить папку Views в /src/sample/views, но это дало мне другую ошибку.   -  person DarkSource    schedule 17.07.2019
comment
я думаю, что это выдает ошибку в этой строке rootcontroller.java строка 32: VBox addProduct = loader.load();   -  person DarkSource    schedule 17.07.2019
comment
Прочтите связанные сообщения, причина, по которой вы получаете сообщение об ошибке, заключается в том, что ваш проект не может загрузить FXML (потому что он не может его найти) из-за вашей структуры каталогов после того, как вы изменили, что отражает изменения в коде getResource(...) проверяет, как вы догадались папка ресурсов, которую он не ищет во всех каталогах, пока не найдет ваш fxml   -  person Matt    schedule 17.07.2019
comment
я попытался установить этап с новым fxml, он отлично работал с этим новым открытым fxml: - FXMLLoader loader = new FXMLLoader(); loader.setLocation(RootController.class.getResource(/Views/AddProduct.fxml)); tryvbox = загрузчик.load(); main.getPrimaryStage().setScene(новая сцена(tryvbox));   -  person DarkSource    schedule 17.07.2019
comment
мой fxml загружался   -  person DarkSource    schedule 17.07.2019


Ответы (1)


Так что в основном после всей работы и помощи проблема возникла из-за блока Try/Catch.

FXMLLoader loader = new FXMLLoader();
loader.setLocation(RootController.class.getResource( "/Views/AddProduct.fxml"));
    try {
        VBox addProduct1 = loader.load();
    } 
    catch (IOException e) {
        e.printStackTrace();
    }

я удалил try/catch и добавил исключение в метод, т.е. void btnInsrtClick(MouseEvent event) throws IOException

person DarkSource    schedule 18.07.2019