Невозможно переключить представления с помощью кнопки в Gluon

Я пытался следовать Как переключать представления в Gluon mobile приложение, использующее javafx?, но оно не переключает мои представления. Не могли бы вы посоветовать мне, что может происходить, или я что-то упускаю? Это не работает во всем проекте в нескольких разных случаях, когда я пытался переключить кнопку с одного представления на другое. Вот пример:

  @Override
protected void updateAppBar(AppBar appBar) {
    appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
    appBar.setTitleText("No Account? Create one! ->");
    appBar.getActionItems().add(MaterialDesignIcon.PERSON_ADD.button(e -> {
        System.out.println("Switch to secondary view.");
        MobileApplication.getInstance().switchView("SECONDARY_VIEW");
    }));
}

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

Изменить: по запросу, вот код, в котором я добавляю SECONDARY_VIEW в фабрику представлений.

package com.mysecondapplication;

import com.mysecondapplication.views.PrimaryView;
import com.mysecondapplication.views.SecondaryView;
import com.mysecondapplication.views.TertiaryView;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.visual.Swatch;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

public class MySecondApplication extends MobileApplication {

public static final String PRIMARY_VIEW = HOME_VIEW;
public static final String SECONDARY_VIEW = "Secondary View";
public static final String TERTIARY_VIEW = "Tertiary View";

@Override
public void init() {
    addViewFactory(PRIMARY_VIEW, PrimaryView::new);
    addViewFactory(SECONDARY_VIEW, SecondaryView::new);
    addViewFactory(TERTIARY_VIEW, TertiaryView::new);

    DrawerManager.buildDrawer(this);
}

@Override
public void postInit(Scene scene) {
    Swatch.AMBER.assignTo(scene);

    scene.getStylesheets().add(MySecondApplication.class.getResource("style.css").toExternalForm());
    ((Stage) scene.getWindow()).getIcons().add(new Image(MySecondApplication.class.getResourceAsStream("/icon.png")));
}

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

Изменить: создание экземпляров:

Основной вид

package com.mysecondapplication.views;

import com.gluonhq.charm.glisten.animation.BounceInRightTransition;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.control.FloatingActionButton;
import com.gluonhq.charm.glisten.control.Icon;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class PrimaryView extends View {

public PrimaryView() {
    
    Label label = new Label("Hello JavaFX World!");

    Button button = new Button("Change the World!");
    button.setGraphic(new Icon(MaterialDesignIcon.LANGUAGE));
    button.setOnAction(e -> MobileApplication.getInstance().switchView("SECONDARY_VIEW"));
    
    VBox controls = new VBox(15.0, label, button);
    controls.setAlignment(Pos.CENTER);
    
    setCenter(controls);
}

@Override
protected void updateAppBar(AppBar appBar) {
    appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
    appBar.setTitleText("No Account? Create one! ->");
    appBar.getActionItems().add(MaterialDesignIcon.PERSON_ADD.button(e -> {
        System.out.println("Switch to secondary view.");
        MobileApplication.getInstance().switchView("SECONDARY_VIEW");
    }));
}

}

Вторичный вид

package com.mysecondapplication.views;

import com.gluonhq.charm.glisten.animation.BounceInRightTransition;
import com.gluonhq.charm.glisten.application.MobileApplication;
import com.gluonhq.charm.glisten.control.AppBar;
import com.gluonhq.charm.glisten.control.FloatingActionButton;
import com.gluonhq.charm.glisten.control.Icon;
import com.gluonhq.charm.glisten.mvc.View;
import com.gluonhq.charm.glisten.visual.MaterialDesignIcon;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.scene.text.Text;

public class SecondaryView extends View {

public SecondaryView() {
    
    Label label = new Label("Hello JavaFX World!");

    Button button = new Button("Change the World!");
    button.setGraphic(new Icon(MaterialDesignIcon.LANGUAGE));
    button.setOnAction(e -> System.out.println("Hello!"));
    
    VBox controls = new VBox(15.0, label, button);
    controls.setAlignment(Pos.CENTER);
    
    setCenter(controls);
    
}

@Override
protected void updateAppBar(AppBar appBar) {
    appBar.setNavIcon(MaterialDesignIcon.MENU.button(e -> getApplication().getDrawer().open()));
    appBar.setTitleText("Have an Account? Log In! ->");
    appBar.getActionItems().add(MaterialDesignIcon.PEOPLE.button(e -> { 
        System.out.println("Switch to Primary View.");
        MobileApplication.getInstance().switchView("PRIMARY_VIEW");
    }));
}
}

person 5-pengoo    schedule 08.04.2021    source источник
comment
Можете ли вы добавить часть вопроса, где вы создаете и добавляете SECONDARY_VIEW к фабрике представлений?   -  person ItachiUchiha    schedule 08.04.2021
comment
минимальный воспроизводимый пример, пожалуйста..   -  person kleopatra    schedule 09.04.2021
comment
пожалуйста, прочитайте указанную страницу справки и действуйте соответственно   -  person kleopatra    schedule 09.04.2021
comment
Я не уверен, что ты имеешь в виду. Мой код читабельный, полный и воспроизводимый. Я объяснил проблему и упомянул, что это сработало. Что конкретно вы хотели бы, чтобы я изменил?   -  person 5-pengoo    schedule 09.04.2021


Ответы (1)


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

person Eugene Ryzhikov    schedule 11.04.2021
comment
Большое спасибо! Теперь это работает. Еще один связанный с этим вопрос: как мне вызвать основное представление, поскольку оно не имеет константы, в которой оно определено. (ссылка: общедоступная статическая финальная строка PRIMARY_VIEW = HOME_VIEW;) - person 5-pengoo; 13.04.2021
comment
Переключение на PRIMARY_VIEW или HOME_VIEW должно работать, поскольку они по существу указывают на одну и ту же константу. Вы всегда должны использовать константы, чтобы гарантировать, что у вас никогда не возникнет проблема, описанная выше. - person Eugene Ryzhikov; 13.04.2021