Java przekazanie kontrolera.

0

Witam, założyłem wcześniej wątek ale nie dostałem sensownej odpowiedzi, miałem na kursie coś takiego sprawdziłem kropka w kropke się wszystko zgadza i dlaczego mi nie działa no? Przekazuje nulla... i wywala errorka.

Caused by: java.lang.NullPointerException
//Główny kontroler 
public class MainController {

    @FXML
    BorderPane borderPane;
    @FXML
    VBox topVBox;

    @FXML
    private MenuController menuController;

    public void setCenter(String filepath, FxmlUtils.Resource resource){
        borderPane.setCenter(FxmlUtils.loadFxml(filepath,resource));
    }
    @FXML
    private void initialize(){
        menuController.setMainController(this);
    }
}
//Kontroler od menu
public class MenuController {

    public static final String HABITS_FXML = "/fxml/Habits.fxml";

    private MainController mainController;

    @FXML
    private void HabitsOnAction() {
        if (mainController != null) {
            System.out.println("not null");
        }
        if (mainController == null){
            System.out.println("its just null");
        }
    }

    public void setMainController(MainController mainController) {
        this.mainController = mainController;
    }
}

proszę o pomoc bo już naprawdę nie mam pomysłów.

1
@FXML
private MenuController menuController;

a jakim cudem to ma zadziałać?

Chcesz mieć koniecznie dostęp do instancji innego kontrolera to robisz to przez

loader.load("some_fxml.fxml);
MyController controller = loader.getController();
1

@Xezolpl: specjalnie dla Ciebie się dokształciłem w zakresie zagnieżdżonych kontrolerów - wcześniej chyba mi intuicja podpowiadała, żeby tego nie używać.
Jak zwykle, jak ktoś pisze, że jest kropka w kropkę tak jak w tutorialu to się okazuje, że jednak nie jest.
Dokumentacja:
https://docs.oracle.com/javafx/2/api/javafx/fxml/doc-files/introduction_to_fxml.html#nested_controllers
a w dokumentacji jak wół, że wstrzykując zagnieżdżony kontroler nazwa pola to musi być {fx_id}Controller.
Czyli w Twoim przypadku:
MainBorderPane.fxml:\

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

<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.VBox?>


<BorderPane fx:id="borderPane" fx:controller="pl.lepszy.ty.controllers.MainController" xmlns="http://javafx.com/javafx/8.0.60" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns:fx="http://javafx.com/fxml/1" >
   <top>
      <VBox fx:id="topVBox" BorderPane.alignment="CENTER">
         <fx:include source="Menu.fxml" fx:id="menu" />
      </VBox>
   </top>
</BorderPane>

MainController:

package pl.lepszy.ty.controllers;

import javafx.fxml.FXML;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.VBox;
import pl.lepszy.ty.utils.FxmlUtils;

public class MainController {

    @FXML
    BorderPane borderPane;
    @FXML
    VBox topVBox;

    @FXML
    private MenuController menuController;

    public void setCenter(String filepath, FxmlUtils.Resource resource){
        borderPane.setCenter(FxmlUtils.loadFxml(filepath,resource));
    }
    @FXML
    private void initialize(){
        menuController.setMainController(this);
    }
0

Wrzuć kod na githuba to zerknę na całość.

1 użytkowników online, w tym zalogowanych: 0, gości: 1