使用FXML的JavaFX Window Changer

时间:2017-10-28 03:14:46

标签: design-patterns javafx fxml

我正在尝试在单击按钮时创建一个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();
    }
}

谢谢!

1 个答案:

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

这就是全部!