Как настроить метод init для мобильного приложения - PullRequest
0 голосов
/ 11 июля 2019

Для лучшего объяснения это здесь.Недавно я начал использовать Gluon для создания мобильных приложений, и у меня возникают некоторые проблемы при создании файла MainMenu.java.Я не могу настроить метод init и продолжаю получать сообщения об ошибках типа «Строка не может быть преобразована в этап» и не знаю, как это исправить.Я был бы очень признателен за помощь, я не уверен, как поступить.Я получаю сообщение об ошибке:

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

Я пытался изменить метод addViewFactory, но ничего не получилось, включая размещение primaryStage внутри last ().

Это файл, который я имеюпроблема с

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

Это страница входа в систему с работающим кодом (некоторые из них показывали, что у меня слишком много кнопок, ярлыков и т. д.)

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по нажатию кнопки

public class MainMenu extends View{

    private Parent prevPage;
    private Stage stage;

    public MainMenu(Parent LoginPage, Stage stage){

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


        Label statement = new Label("Sign In");


    }

Это больше не позволяет мне запускать приложение после создания файла MainMenu.java, и оно происходит в первом фрагменте кода.

1 Ответ

0 голосов
/ 12 июля 2019

Подпись 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 созданием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...