поле, которое должно быть назначено fxml, выбрасывает исключение NullPointerException при получении доступа от внутреннего класса - javaFX - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть контроллер для файла fxml. Контроллер имеет поле public BorderPane mainBorderPane;, которое должно быть заполнено панелью границы того же fx:id, что и в файле fxml. Когда я пытаюсь получить доступ к нему из внутреннего класса, это дает NullPointerExcetion

clearBorderPaneCenter(); и clearBorderPaneRight работают просто отлично, но когда я запускаю cashSceneController.show(), он вылетает на линии mainBorderPane.setRight(rightLayout);

fxml файл:

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

<?import javafx.scene.image.*?>
<?import java.net.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.text.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<BorderPane fx:id="mainBorderPane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Program.gui.MainSceneController">
   <top>
      <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </top>
   <left>
      <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </left>
   <center>
      <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </center>
   <right>
      <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </right>
   <bottom>
      <Pane prefHeight="200.0" prefWidth="200.0" BorderPane.alignment="CENTER" />
   </bottom>
</BorderPane>

Упрощенная версия контроллера:

public class MainSceneController {

    MainSceneController.CashSceneController cashSceneController = new MainSceneController.CashSceneController();
    public BorderPane mainBorderPane;

    public void switchLayout(byte ID){
        //todo Make this work switchScene()

        clearBorderPaneCenter();
        clearBorderPaneRight();
        cashSceneController.show();
    }

    public void clearBorderPaneRight(){
        try {
            mainBorderPane.setRight(null);
            OutputHelper.log("cleared right of mainBorderPane");
        } catch (Exception e){
            OutputHelper.log("clearing right of mainBorderPane not required - already cleared");
        }
    }

    public void clearBorderPaneCenter(){
        try {
            mainBorderPane.setCenter(null);
            OutputHelper.log("cleared centre of mainBorderPane");
        } catch (Exception e){
            OutputHelper.log("clearing centre of mainBorderPane not required - already cleared");
        }
    }

    public class CashSceneController{
        VBox rightLayout;
        public void show() {
            setVBox();
            mainBorderPane.setRight(rightLayout);
        }

       public void setVBox(){
           rightLayout = new VBox();
           //......
       }
    }
}

Так загружается файл fxml

SceneController = new MainSceneController(new Scene(FXMLLoader.load(getClass().getResource("gui/MainScreen.fxml"))));

Надеюсь, я достаточно хорошо объяснил свою проблему. Я новичок в переполнении стека и понятия не имею, что такое хороший вопрос

Редактировать: похоже, что проблема вызвана тем, что mainBorderPane вообще не назначается. Кажется, что clearBorderPaneCenter и clearBorderPaneRight не дают сбоя, потому что они перехватываются при попытке try Любые идеи, почему mainBorderPane не может быть назначен правильно?

1 Ответ

0 голосов
/ 04 сентября 2018

Вам не хватает аннотации fxml. Для FXMLLoader требуется внедрить BorderPane в код

    @FXML      
    public BorderPane mainBorderPane;
...