switchView к предыдущему View вызывает NullPointerException - PullRequest
0 голосов
/ 21 января 2019

Я создаю MultiView-проект с gluon mobile, и проблема возникает, когда я переключаюсь на View, который я уже использовал ранее.

Это мое конкретное представление HOME_VIEW, поэтому оно вызывается при первом запуске приложения:

"Основной" -класс с объявлением вида:

public class GluonApplication extends MobileApplication {

    public static final String START_VIEW = HOME_VIEW; 
    public static final String LOGIN_VIEW = "Login View";
    //other views

    @Override
    public void init() {
        addViewFactory(START_VIEW, () -> new StartView());
        addViewFactory(LOGIN_VIEW, () -> new LoginView());
        //other views

        DrawerManager.buildDrawer(this);
        //other code
    }

класс StartView. Содержимое просмотра устанавливается в соответствии с переменной, но в этом случае важна только часть, окруженная else{}.

public class StartView extends View {

    public StartView() {
  getStylesheets().add(StartView.class.getResource("start.css").toExternalForm());

        LoginSpace lspace = new LoginSpace();
        setCenter(lspace);
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
        appBar.setTitleText("Login");
        appBar.setDisable(true);
        appBar.setVisible(false);
    }

    class LoginSpace extends VBox {

        TextField name;
        TextField pass;

        public LoginSpace() {
            g.p("set LoginSpace",2);
            String s = null;

            if(KopfrechenTrainer.getLoggedIn()) {
                //code
            }
            else {  
            HBox h = new HBox(10.0);
            name = new TextField();
            pass = new TextField();
            Button login = new Button("Anmelden");
            Button reg = new Button("Neu registrieren");

            name.setFloatText("Nutzername");
            pass.setFloatText("Passwort:");
            login.setOnAction(e -> onLogin());
            reg.setOnAction(e -> onReg());

            h.getChildren().addAll(login, reg);
            h.setAlignment(Pos.CENTER);
            getChildren().addAll(name, pass, h);
            KopfrechenTrainer.initKT();

            setSpacing(25);
            setAlignment(Pos.CENTER);
            Insets pad = new Insets(20,50,20,50);
            setPadding(pad);
            }
        }

        private void onContinue() {
            //code
        }

        private void onLogin() {
            g.p("button_login pressed",2);
        String name = this.name.getText();
        String pass = this.pass.getText();
        boolean logIn = KopfrechenTrainer.checkLogin(name, pass);
        if (logIn) {
            this.name.setText(null);
            this.pass.setText(null);
            MobileApplication.getInstance().switchView("Login View");
        }
        else { 
            Alert fault = new Alert(AlertType.NONE, "Nutzername oder Passwort ist nicht korrekt. " + 
                    "Bitte versuche es erneut oder registriere dich neu.");
            fault.showAndWait();
        }
        }

START_VIEW не указан в NavigationDrawer, я не знаю, имеет ли это значение. Обычно LOGIN_VIEW вызывается из START_VIEW:

import static com.gluonapplication.GluonApplication.START_VIEW;
//other imports

public class LoginView extends View {

    public LoginView() {
        //...
        HomeSpace hspace = new HomeSpace();
        setCenter(hspace);
    }

    @Override
    protected void updateAppBar(AppBar appBar) {
        appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
        appBar.setTitleText("Startseite");
        appBar.setDisable(false);
    }

    class HomeSpace extends VBox {

        public HomeSpace(){
            g.p("set HomeSpace", 2);

            Label welcome = new Label("Herzlich wilkommen "+KopfrechenTrainer.getName()+"!");
            Button logout = new Button("Abmelden");
            Button leave = new Button("Abmelden und beenden");
            Button quit = new Button("Beenden");

            logout.setOnAction(e -> onLogout());
            leave.setOnAction(e -> onLeave());
            quit.setOnAction(e -> onQuit());

            getChildren().addAll(welcome, logout, quit, leave);
            setSpacing(25);
            setAlignment(Pos.CENTER);
            setVisible(true);
        }

        private void onLogout() { 
            KopfrechenTrainer.logout();
            MobileApplication.getInstance().switchView(START_VIEW);//this line is of importance!

        }

        private void onLeave() {
            //code
        }

        private void onQuit() {
            //code
        }
    }
}

При нажатии кнопки выхода из системы вид переключается на START_VIEW, но в то же время отлаживается следующая ошибка:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
    at com.gluonhq.impl.charm.a.b.b.z.layoutChildren(SourceFile:159)
    at com.gluonhq.impl.charm.a.b.b.y.layoutChildren(SourceFile:23)
    at javafx.scene.control.Control.layoutChildren(Control.java:578)
    at javafx.scene.Parent.layout(Parent.java:1087)
    at javafx.scene.Parent.layout(Parent.java:1093)
    at javafx.scene.Parent.layout(Parent.java:1093)
    at javafx.scene.Parent.layout(Parent.java:1093)
    at javafx.scene.Scene.doLayoutPass(Scene.java:552)
    at javafx.scene.Scene$ScenePulseListener.pulse(Scene.java:2397)
    at com.sun.javafx.tk.Toolkit.lambda$runPulse$29(Toolkit.java:398)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.Toolkit.runPulse(Toolkit.java:397)
    at com.sun.javafx.tk.Toolkit.firePulse(Toolkit.java:424)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:518)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulse(QuantumToolkit.java:498)
    at com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(QuantumToolkit.java:491)
    at com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$403(QuantumToolkit.java:319)
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
    at java.lang.Thread.run(Thread.java:748)

Любое действие кнопки на новом START_VIEW не выполняется, и отображается только белый экран.

Я понятия не имею, почему это происходит, и я уже создал подобное тестовое приложение, которое работает отлично! Заранее спасибо за любые идеи, как решить эту проблему!

...