我正在尝试在单击按钮时创建一个Window(场景)转换器。具体来说,在登录用户时更改窗口。我想知道如何减少冗余代码,并将负责更改窗口的方法置于集中的位置。是否有特定的设计模式?
到目前为止,我有这个:
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();
}
}
谢谢!
答案 0 :(得分:1)
对于动态变化的阶段,您可以(我目前正在使用此方法)拥有AnchorPane。比如说,你的根上面有一个AnchorPane。您可以使用此窗格更改场景。 首先,在控制器中声明AnchorPane:
@FXML
AnchorPane dynamicPane;
然后,你应该提供一个方法(特别是一个setter),它看起来像,
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"));
}
这就是全部!