如何为移动应用程序设置初始化方法

时间:2019-07-11 20:52:52

标签: java javafx

这里有一个更好的解释。我最近开始使用Gluon创建移动应用程序,并且在创建MainMenu.java文件时遇到了一些问题。我无法配置init方法,并继续收到诸如“无法将字符串转换为阶段”之类的错误,并且不确定如何解决此问题。对于不确定的帮助,将不胜感激。我不断收到错误消息:

#include <Python/Python.h>

我试图更改addViewFactory方法,但没有做任何事情,包括将primaryStage放置在last()内。

这是我遇到问题的文件

error: incompatible types: invalid constructor reference
 addViewFactory(HOME_VIEW, LoginPage::new);
                                  ^
constructor LoginPage in class LoginPage cannot be applied to given types required: Stage
 found: no arguments
 reason: actual and formal argument lists differ in length

这是具有有效代码的登录页面(仅显示一些我对按钮,标签等有太多了解的方式)

public class AlexDemo extends MobileApplication {

    public static final String LOGIN_VIEW = HOME_VIEW;

    @Override
    public void init() {

            addViewFactory(LOGIN_VIEW, () -> new LoginPage(LOGIN_VIEW));    

    }

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

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

这是单击按钮后的MainMenu页面

public class LoginPage extends View {

    private Parent root;

    public LoginPage(Stage primaryStage) {

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

        //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();
    }

    @Override
    protected void updateAppBar(AppBar appBar) {

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

    }

}

创建MainMenu.java文件后,它不允许我再运行该应用程序,并且它出现在第一段代码中。

1 个答案:

答案 0 :(得分:0)

addViewFactory的签名是

void addViewFactory(java.lang.String viewName, java.util.function.Supplier<View> supplier)

即使用方法引用作为第二个参数,您需要使用带有0个参数的方法(或构造函数)。 LoginPage没有满足此要求的构造函数;因此编译器不接受LoginPage::new

关于View的子类的构造函数中的错误:

View没有提供不带参数的构造函数。因此,您需要在每个构造函数的开始处显式调用View的一个构造函数(只要您不使用构造函数链接),并使用super(<args>);作为构造函数中的第一条语句

示例

public MainMenu(Parent LoginPage, Stage stage) {
    super(LoginPage); // use View(javafx.scene.Node content)

    this.prevPage = LoginPage;
    this.stage = stage;

    Label statement = new Label("Sign In");
}
private LoginPage(BorderPane root) {
    super(root);

    //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();

    // TODO: add something to root???
}

public LoginPage() {
    this(new BorderPane());
}

请注意,传递Stage毫无意义,因为这是MobileApplication处理Scene / Stage创建的责任。