JavaFX Window Changer с использованием FXML

В настоящее время я пытаюсь изменить окно (сцену) при нажатии на кнопку. В частности, изменение окна при входе в систему пользователя. Я хотел бы знать, как я могу уменьшить избыточный код и разместить методы, отвечающие за изменение окон, в централизованном месте. Есть ли особый шаблон дизайна?

Пока у меня есть это:

Main.java

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = (Parent) FXMLLoader.load(getClass().getResource("Login.fxml"));
        Scene scene = new Scene(root);
        scene.getStylesheets().add("Styles.css");
        stage.setScene(scene);
        stage.setTitle("App");
        stage.setResizable(false);
        stage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}

LoginController.java

public class LoginController implements Initializable {

    @FXML
    private TextField email;
    @FXML
    private PasswordField password;
    @FXML
    private Button buttonLogin;

    private Stage stage;

    @Override
    public void initialize(URL url, ResourceBundle rb) {}    

    @FXML
    private void login(ActionEvent event) throws Exception {
        stage = (Stage) buttonLogin.getScene().getWindow();
        Parent root = (Parent) FXMLLoader.load(getClass().getResource("Profile.fxml"));
        Scene scene = new Scene(root);
        scene.getStylesheets().add("Styles.css");
        stage.setScene(scene);
        stage.centerOnScreen();
        stage.show();
    }
}

Спасибо!

1 ответ

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

@FXML
AnchorPane dynamicPane;

Затем вы должны предоставить метод (в частности, сеттер), где он будет выглядеть так:

private void setDynamicPane(AnchorPane dynamicPane){
      this.dynamicPane.getChildren().clear();
      this.dynamicPane.getChildren().add(dynamicPane);
}

Тогда все готово, и теперь вы можете изменить сцену, просто вызвав ее в ActionEvent кнопки следующим образом:

@FXML
private void yourButtonAction(ActionEvent evt){
    setDynamicPane(FXMLLoader.load(getClass().getResources("path/to/your/file.fxml"));
}

Это все!

Другие вопросы по тегам