Java przekazanie kontrolera.

Odpowiedz Nowy wątek
2019-08-15 20:01
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.


„Standardowa edukacja zapewni Ci przeżycie. Samokształcenie- fortunę." - Jim Rohn
Pokaż pozostałe 3 komentarze
Bo aplikacja ma być domyślnie dostępna bez internetu... - Xezolpl 2019-08-15 21:19
A co ma piernik do wiatraka? o_O Przecież można sobie odpalić lokalnie jara który stawia webowy interfejs, gdzie tu widzisz jakiś problem z internetem? - Shalom 2019-08-15 21:20
@Shalom: ja używam :D jako jedyny w Polsce ale używam. Tak swoją drogą to jest naprawdę fajna biblioteka do robienia GUI, tyle że nikomu nie potrzebna... - dymul 2019-08-15 21:28
Dobra to w takim razie taka aplikacja webowa odpalała by się po prostu w przeglądarce tak? I wtedy wszystko było by w Javie a GUI w czym? Electron? - Xezolpl 2019-08-16 07:39
A GUI w czym chcesz, może być jaki elektron a możesz tam miec normalnie jakiś html/thymyleaf i JS. - Shalom 2019-08-16 09:25

Pozostało 580 znaków

2019-08-15 21:22
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();
edytowany 1x, ostatnio: dymul, 2019-08-15 21:25
nie mam już pojęcia, wszystkie sposoby próbowałem, to to już kropka w kropke jak na kursie, na którym działało - Xezolpl 2019-08-15 21:23
jakby było kropka w kropkę tak jak na kursie to by działało - widać jest inaczej. Niestety nie podałeś co to za kurs, nie pokazałeś działającego przykładu więc ciężko się odnieść. - dymul 2019-08-15 21:26
https://github.com/ZacznijPro[...]rces/fxml/BorderPaneMain.fxml a dokładnie zależność pomiędzy main controller a topmenubuttonscontroller - Xezolpl 2019-08-16 07:37
Tylko zaadaptowane do mojej aplikacji - Xezolpl 2019-08-16 07:38

Pozostało 580 znaków

2019-08-16 08:06

@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/javaf[...]_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);
    }
Jeju, rzeczywiście, przepraszam moje niedopatrzenie na temat tej dokumentacji... Dziękuję, a mam jeszcze pytanie bo widzę że piszesz w tym FX. Tak z doświadczenia mógłbyś mi coś doradzić? Jeżeli chcę robić aplikacje desktopowe w javie to w czym mam je pisać? Jako webowe czy w takim javafx czy w czym? Jeżeli java fx to na tej nowej 12 czy starej 8 + maven? - Xezolpl 2019-08-16 21:23
Jedyne co mogę poradzić to odpuszczenie sobie aplikacji desktop. Nikt z tego dziś nie korzysta i raczej korzystał nie będzie. - dymul 2019-08-16 22:56
Ale no jak... przecież wszystkie discordy, programy itd przecież jakoś żyją, a są (z tego co rozumiem) aplikacjami desktopowymi, tak? - Xezolpl 2019-08-17 05:52

Pozostało 580 znaków

2019-08-16 15:17
0

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

Wrzuciłbym ale zepsułem go chyba całkiem już... zaczne od nowa :/ - Xezolpl 2019-08-17 07:49

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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