2017-10-28 13 views
0

버튼을 클릭 할 때 현재 창 (장면) 체인저를 만들려고합니다. 특히, 사용자 로그인시 창을 변경하십시오. 중복 코드를 줄이고 집중 방식으로 창을 변경하는 데 필요한 메소드를 배치하는 방법을 알고 싶습니다. 따라야 할 특정 디자인 패턴이 있습니까?FXML을 사용하는 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); 
} 

그것은 모든 일, 그리고 : 첫째, 컨트롤러의 AnchorPane 선언 버튼의 ActionEvent에서 다음과 같이 호출하면 장면을 변경할 수 있습니다.

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

그게 전부입니다!