Переключение на разные экраны JavaFX и FXML - PullRequest
0 голосов
/ 22 сентября 2018

Я новичок в JavaFX и во время работы над проектом пытаюсь переключать экраны.Я думаю о настройке соответствующей видимости AnchorPane true или false, и у меня возникли проблемы при доступе к AnchorPane из другого контроллера.Я пытался сделать статический AnchorPane, но он дает исключение NullPointerException.

Это мой код.

Класс контроллера

public class Controller {

    @FXML
    AnchorPane signInPane;

    @FXML
    private TextField usernameForSignIn;

    @FXML
    private PasswordField password;

    @FXML
    private Button signIn;

    @FXML
    private Button registration;

    @FXML
    void initialize() {
        registration.setOnAction(event -> {
            signInPane.setVisible(false);
            SignUpController.registerPane.setVisible(true);
        });

        signIn.setOnAction(event ->  {
            String usernameText = usernameForSignIn.getText().trim();
            String passwordText = password.getText().trim();

            if(!usernameText.equals("") && !passwordText.equals("")) {
                loginUser(usernameText, passwordText);
            } else {
                System.out.println("Empty login and/or password");
            }

        });
    }

    private void loginUser(String usernameText, String passwordText) {
    }

}

Класс SignUpController

public class SignUpController {

    @FXML
    static AnchorPane registerPane;

    @FXML
    private TextField email;

    @FXML
    private PasswordField pass;

    @FXML
    private Button signUp;

    @FXML
    private TextField fname;

    @FXML
    private TextField lname;

    @FXML
    private TextField username;

    @FXML
    private RadioButton radioMale;

    @FXML
    void initialize() {

        signUp.setOnAction(event -> {

            signUpNewUser();

        });
    }

    private void signUpNewUser() {
        DatabaseHandler databaseHandler = new DatabaseHandler();

        String firstName = fname.getText();
        String lastName = lname.getText();
        String usname = username.getText();
        String password = pass.getText();
        String e_mail =  email.getText();
        String gender = "";
        if(radioMale.isSelected()) {
            gender = "Male";
        } else {
            gender = "Female";
        }

        User user = new User(firstName,lastName,usname,password,e_mail,gender);

        databaseHandler.signUpUser(user);

    }
}

Мне нужно перейти с этого экрана enter image description here

, не закрывая окно enter image description here

Я попытался решить проблемукак это, но он закрывает окно и открывает новое.

registration.setOnAction(event -> {
    registration.getScene().getWindow().hide();

    FXMLLoader loader = new FXMLLoader();
    loader.setLocation(getClass().getResource("/sample/view/signUp.fxml"));

    try {
        loader.load();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Parent root = loader.getRoot();
    Stage stage = new Stage();
    stage.setScene(new Scene(root));
    stage.showAndWait();

// signInPane.setVisible(false);
});

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Примерно так будет гарантировать, что ваш FXML будет загружен до инициализации ().Вам не нужно скрывать AnchorPane, так как экземпляры уже загружены.Скрытие элементов, созданных из FXML, обычно приводит к ошибкам.

public class Controller {

    @FXML
    Button button_CustomerInfo;
    @FXML
    Button button_A1Child;
    @FXML
    BorderPane bPane;
    @FXML
    ToggleGroup tog;
    Parent r1;
    Parent r2;

    // CREATE SOMETHING LIKE THIS
    // THIS SAMPLE CODE USES THE SAME BORDERPANE
    // AND THE CENTER OF THE BORDERPANE
    // IS CHANGED WHEN A BUTTON IS PRESSED
    {
        try {
            r1 = FXMLLoader.load(getClass().getResource("SecondSreen.fxml"));
            r2 = FXMLLoader.load(getClass().getResource("FirstScreen.fxml"));
        } catch (IOException e) {
            e.printStackTrace();
        }


    }

    public void initialize() {


        button_CustomerInfo.setOnAction(e-> {
            bPane.setCenter(r2);
        });

        button_A1Child.setOnAction(e-> {
            bPane.setCenter(r1);
        });
    }
}
0 голосов
/ 22 сентября 2018

Создайте одно окно и используйте его повторно, вместо того, чтобы каждый раз создавать новое.Затем вы можете либо просто проверить, отображается ли он, либо отключить, какой бы элемент управления ни отображал его при отображении.

...