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"));
}
Это все!