使用JavaFX和Gluon,单击按钮时如何从loginPage更改为Main菜单?

使用JavaFX和Gluon,单击按钮时如何从loginPage更改为Main菜单?,java,javafx,gluon-mobile,Java,Javafx,Gluon Mobile,我是胶子应用的新手。我已经使用了JavaFX,我正在构建一个移动应用程序。登录页面在其打开状态下工作,现在我尝试将其配置为在单击按钮时转到主菜单。我不确定如何设置,以及是否需要调整init方法 我已尝试添加另一个addViewFactory,但不起作用。我试图创建一个带有操作的按钮,但之后代码加载失败 这是应用程序创建的主文件 public class AlexDemo extends MobileApplication { @Override public void init() {

我是胶子应用的新手。我已经使用了JavaFX,我正在构建一个移动应用程序。登录页面在其打开状态下工作,现在我尝试将其配置为在单击按钮时转到主菜单。我不确定如何设置,以及是否需要调整init方法

我已尝试添加另一个addViewFactory,但不起作用。我试图创建一个带有操作的按钮,但之后代码加载失败

这是应用程序创建的主文件

public class AlexDemo extends MobileApplication {

@Override
public void init() {

    addViewFactory(HOME_VIEW, LoginPage::new);

}

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

    ((Stage) scene.getWindow()).getIcons().add(new     Image(AlexDemo.class.getResourceAsStream("/icon.png")));

  }
  }
这是登录页面

 public class LoginPage extends View {

 private Parent root;

    private LoginPage(BorderPane root) {

    super(root);

    Scene scene = new Scene(root, 500, 800);

    //For the label displaying "Sign In" to prompt the user
    VBox login = new VBox();
    Label statement = new Label("Sign In");
    statement.setFont(Font.font("Verdana", FontWeight.BOLD, 13));

    //HBox for the email the user wants to sign in with
    HBox firstUserPrompt = new HBox();
    Label email = new Label("Username/\nEmail: ");
    email.setFont(Font.font("Verdana", 13));
    firstUserPrompt.setAlignment(Pos.CENTER);
    TextField userPrompt = new TextField();
    firstUserPrompt.getChildren().addAll(email, userPrompt);

    //HBox for the password the user wants to sign in with
    HBox secondUserPrompt = new HBox();
    Label password = new Label("Password: ");
    password.setFont(Font.font("Verdana", 13));
    secondUserPrompt.setAlignment(Pos.CENTER);
    TextField userPrompt2 = new TextField();
    secondUserPrompt.getChildren().addAll(password, userPrompt2);

    //Sign in Button if the account exists
    Button signIn = new Button("Sign In");
    signIn.setMaxSize(150, 200);
    signIn.setFont(Font.font("Verdana", 13));

  /*   signIn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            MainMenu main = new MainMenu(root, stage);
            scene.setRoot(main); 
            primaryStage.setTitle("Main Menu");
            primaryStage.setWidth(500);
            primaryStage.setHeight(800);

    });*/


    //*** ADD SPACING BETWEEN SIGN IN AND SIGN UP ***

    //If user does not have an account
    VBox newAccount = new VBox();
    Label noAccount = new Label("Don't have an account? Sign up here: ");
    noAccount.setFont(Font.font("Verdana", FontWeight.BOLD, 13));

    Button signUp = new Button("Create Account");
    signUp.setMaxSize(150, 200);
    signUp.setFont(Font.font("Verdana", 13));

    newAccount.setSpacing(15);
    newAccount.setAlignment(Pos.TOP_CENTER);
    newAccount.setMargin(statement, new Insets(55, 25, 55, 25));
    newAccount.getChildren().addAll(noAccount, signUp);
    root.setBottom(newAccount);

    //makes everything set vertically following one after another
    setCenter(login);
    login.setSpacing(15);
    login.setAlignment(Pos.TOP_CENTER);
    login.setMargin(statement, new Insets(55, 25, 55, 25));
    login.setPadding(new Insets(0, 20, 10, 20)); 
    login.getChildren().addAll(statement, firstUserPrompt, secondUserPrompt, signIn, newAccount);

}

    public LoginPage() {

 this(new BorderPane());

 }

@Override
protected void updateAppBar(AppBar appBar) {

    appBar.setTitleText("Book App");
    appBar.setSpacing(115);

}

}
}


当点击登录页面上的按钮时,它会将我发送到主菜单页面

对于初学者,我建议您看看Glion Mobile,看看视图是如何工作的

此外,您还应该检查许多不同的视图,在许多情况下,这些视图包含多个视图,以便了解如何从一个视图切换到另一个视图

您应该尝试在IDE中使用胶子,这将为您创建一个具有2个视图的初始项目

现在谈谈你的问题:

我已尝试添加另一个addViewFactory,但不起作用

这是根据需要添加尽可能多视图的方法

@Override
public void init() {
    addViewFactory(HOME_VIEW, LoginPage::new);
    addViewFactory("MainView", MainView::new);
    ...
}
关于如何创建视图,这是不必要的:

public class LoginPage extends View {
     private Parent root;

     private LoginPage(BorderPane root) {
         super(root);
         Scene scene = new Scene(root, 500, 800);
         VBox login = new VBox();
         ...
         root.setBottom(newAccount);
         setCenter(login);
         ...
         VBox newAccount = new VBox();
         ...
         root.setBottom(newAccount);
    }

    public LoginPage() {
        this(new BorderPane());
    }
}
首先,从BorderPane查看,Gluon Mobile管理视图以添加到场景中,因此您不需要场景

您的上述代码可以简化为:

public class LoginPage extends View {

     public LoginPage() {
         VBox login = new VBox();
         ... 
         setCenter(login);
         ...
         VBox newAccount = new VBox();
         ...
         setBottom(newAccount);
     }
}
关于主菜单视图,也可以简化为:

public class MainMenu extends View {

    public MainMenu() {
        Label statement = new Label("Sign In");
        setCenter(statement);
    }
}
关于切换视图,例如,要从主视图切换到主菜单,只需执行以下操作:

Button signIn = new Button("Sign In");
signIn.setOnAction(e -> 
     MobileApplication.getInstance().switchView("MainView"));
或者,如果从主菜单注销,则可以返回主视图:

Button logOut = new Button("Log Out");
logOut.setOnAction(e -> 
     MobileApplication.getInstance().goHome());

当我在登录页面中删除Scene=new Scene行时,应用程序将再次加载…如何设置按钮以转到下一页堆栈溢出中至少已经回答了100个类似的问题。试着只搜索登录窗口或登录页面或更改场景。甜心,我会做更多的研究,我找不到任何,但我从来没有使用过那些关键术语我已经摆脱了场景场景=新场景部分,代码再次工作只是没有按钮。好的,这是有道理的。我应该在哪里初始化MobileApplication?你没有。它是应用程序类的扩展,因此自动完成。它告诉我它找不到符号/变量MobileApplication。我是个笨蛋,很抱歉有一个插件。您在主类AlexDemo中使用MobileApplication,因此您的项目中已经包含Gluon Mobile依赖项。
Button logOut = new Button("Log Out");
logOut.setOnAction(e -> 
     MobileApplication.getInstance().goHome());