无法在 Gluon 中使用按钮切换视图

Unable to Switch Views with Button in Gluon

我试着跟随 ,但这并没有改变我的观点。你能告诉我可能发生的事情,或者我是否遗漏了什么吗?在我尝试将按钮从一个视图切换到另一个视图的多个不同实例中,这在整个项目中都不起作用。 这是一个例子:

  @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");
    }));
}
}

切换视图时,您传递的字符串与注册时使用的字符串不一样。为确保匹配,请使用已在 MySecondApplication class

中定义的常量