2016-04-15 19 views
0

我想通過使用在主函數中創建的引用來更改Controller類外部的FXML元素的文本,但是我得到一個NullPointerException。從引用外部更改FXML元素 - NullPointerException

類控制器:

public class Controller implements Initializable { 

    @FXML 
    public ComboBox<String> comboBoxSelectPort; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     Language l = new Language(); 
     l.setLanguage(); 

     comboBox.setPromptText("New Text"); // This works! 
    } 
} 

類語言:

public class Language { 

    private Controller c = Main.controller; 

    public void setLanguage(){ 

     c.comboBox.setPromptText("New Text"); // This is NOT working! 
    } 
} 

UPDATE 1:

類主要:

public class Main extends Application { 

    public static Stage stage; 
    public static Controller controller; 
    @Override 
    public void start(Stage stage) throws Exception { 

     FXMLLoader loader = new FXMLLoader(getClass().getResource("Scene.fxml")); 
     Parent root = (Parent) loader.load(); 
     controller = (Controller) loader.getController(); 
     System.out.println(controller);   // Works! 
     .... 

但在控制器或語言類

System.out.println(Main.controller);  // Output: Null 

更新2:

這個問題似乎是,該控制器在主創建befor創建參考。

回答

0

傳遞控制器參考Language實例:

public class Language { 

    private final Controller c ; 

    public Language(Controller controller) { 
     this.c = controller ; 
    } 

    public void setLanguage(){ 

     c.comboBox.setPromptText("New Text"); // This is NOT working! 
    } 
} 

然後

public class Controller implements Initializable { 

    @FXML 
    public ComboBox<String> comboBoxSelectPort; 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 

     Language l = new Language(this); 
     l.setLanguage(); 

     comboBox.setPromptText("New Text"); // This works! 
    } 
}