2017-10-28 10 views
0

現在、ボタンをクリックしたときにウィンドウ(シーン)チェンジャーを作成しようとしています。具体的には、ユーザーにログインするときにウィンドウを変更します。どのようにして冗長コードを減らし、ウィンドウを集中管理するためのメソッドを配置するかを知りたい。それに続く特定のデザインパターンはありますか?FXFを使用しているJavaFXウィンドウチェンジャー

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

'public static void loadSceneToStage(String resourceName、Stage stage)throws IOException {...}' ??? – fabian

答えて

1

動的に変化するステージでは、(現在このメソッドを使用しています)アンカーパネルを使用できます。さて、ルートの上に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")); 
} 

関連する問題