2017-12-10 1 views
0

내 이벤트 핸들러에 대한 다음과 같습니다 코드가에 뷰 컨트롤러에서 변수를 액세스 할 수 없습니다자바 FX - 이벤트 핸들러

public EventHandler<MouseEvent> handleMouseClickedEvent = new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(MouseEvent event) { 
     // Grab the Pane from the event. 
     Pane p = (Pane) event.getSource(); 

     // Set the colour of that pane. 
     String colour = ViewController.brushColourPicker.getValue().toString(); 
     p.setStyle("-fx-background-color: " + colour); 
    } 
}; 

brushColourPicker 이벤트 핸들러 내에서 정적 컨텍스트에서 액세스 할 수 없습니다 - 나는 변수 정적의 할 경우 내보기 컨트롤러, 나는 NPE를 얻을. 또한 getter는 정적 변수 여야하므로 내 변수에 대한 액세스를 방해합니다.

도움을 주시면 대단히 감사하겠습니다. ,

먼저 당신의 컨트롤러 (들) 참조 (들)을 저장하는 클래스를 생성 하나는 다음 작업을 수행 할 수 있습니다 다른 클래스에서 컨트롤러의 뷰 요소에 액세스하기 위해

+1

[mcve]를 게시하십시오. – user1803551

+0

관련 FXML을로드하여 표시 할 때 생성 된 실제 컨트롤러 * 인스턴스 *에서 해당 필드에 액세스해야합니다. –

답변

1

. 그런 다음

public class Controllers { 

     private static MainController mainController; 

     public static MainController getMainController() { 
      return mainController; 
     } 

     public static void setMainController(MainController mainController) { 
      Controllers.mainController = mainController; 
     } 

     public static void setMainControllerLoader(FXMLLoader mainControllerLoader) { 
      Controllers.mainController = mainControllerLoader.getController(); 
     } 
} 

, 다음을 수행하십시오

public class MainController 
{ 
    // view elements.. 

    public void initialize() 
    { 
     Controllers.setMainController(this); 
     // ... 
    } 
} 

또는 :

 Parent root; 
     FXMLLoader loader; 
     try { 
      loader = new FXMLLoader(getClass().getClassLoader().getResource("path/to/yourFxml.fxml")); 
      root = loader.load(); 
      Controllers.setMainControllerLoader(loader); 
     } catch (IOException e) { 
      // Failed to load fxml 
     } 
     Stage stage = new Stage(); 
     stage.setScene(new Scene(root, 600, 400)); 

을 이제 모든 클래스에서 Controllers.getMainController()를 호출 할 수 있으며, 예를 들어, 컨트롤러의 뷰 요소에 액세스 Controllers.getMainController().mainPane.setVisible(false)

+1

완벽하게 일했습니다. 감사합니다! – tobycode

+0

다행히 듣고, 환호! –