2016-11-17 5 views
1

컨트롤러가 두 개 있습니다 (authcontrollermaincontroller). 메서드 레지스터가 새 창을 엽니 다 - register.fxml. 내가 처음 창에서 Stage을 얻으려고 곳Javafx 스테이지가 null입니다.

register.setOnAction(new EventHandler<ActionEvent>() { 
      public void handle(ActionEvent event) { 
       Stage stage = new Stage(); 
       AnchorPane pane = null; 
       try { 
        pane = FXMLLoader.load(getClass().getResource("/fxml/register.fxml")); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } 

       stage.setTitle("Регистрация в системе"); 
       Scene scene = new Scene(pane, 600, 450); 
       stage.setResizable(false); 
       stage.setScene(scene); 
       stage.show(); 
      } 
     }); 

는 그리고 나서이 방법이 두 번째 컨트롤러는, 초기화합니다.

@Override 
    public void initialize(URL location, ResourceBundle resources) { 
    Stage stage = (Stage) tabOnePane.getScene().getWindow(); 

} 

tabOnePane은 두 번째 창에서 탭 패널입니다. 그러나 이것을 시도하면 내 Stage은 항상 null입니다. 하지만 다른 처리 방법으로 Stage을 얻으려고하면 할 수 있습니다. 내 두 번째 창이로드되었을 때 첫 번째 창 Stage을 얻는 방법?

초 컨트롤러는 인터페이스를 구현 Initializable

+1

그것은이 작업을 수행하는 나쁜 생각입니다. initialize 메소드에서'Window'를 얻는다면, 당신은 씬에 추가되는'tabOnePane'과 그 씬이 윈도우에 추가되는 것에 의존합니다. 따라서 코드를 유지 관리하기가 어렵습니다. 당신은 컨트롤러 클래스 밖에서 그 스테이지로 무엇을 하든지 할 수있는 방법을 찾아야합니다. 어쨌든 fxml을로드하기 전에 어떻게 tabOnePane을 장면에 추가 할 수 있었습니까? – fabian

+0

fx : id를 사용하여 fxml-file에서 tabOnePane을 추가했습니다. 불행하게도이 클래스를이 클래스에 사용해야합니다. 왜냐하면 나중에 두 번째 클래스에서 사용할 속성을 제공하기 때문입니다. – Artificial

답변

0

먼저 컨트롤러의 초기화 방법 단계에 결코 질수 액세스 할 수 있습니다. 두 번째는 다음 컨트롤러로 단계를 통과하기 위해이 같은 fxml로드 setStage (단계 stge)와 같은 컨트롤러에 메소드를 추가 :

FXMLLoader loader = new FXMLLoader(); 
    loader.setLocation(getClass().getResource("/root/mainGui.fxml")); 
    Parent root = loader.load(); 
    Scene scene = new Scene(root, 500, 400); 
    controllerInterface ctrl = loader.getController(); 
    ctrl.setStage(primaryStage);