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