使用参考从控制器外部更改 FXML 元素 - NullPointerException
Changing FXML element from outside the Controller with reference - NullPointerException
我想通过使用我在主函数中创建的引用从控制器外部更改 FXML 元素的文本 class,但我收到 NullPointerException。
Class 控制器:
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!
}
}
Class 语言:
public class Language {
private Controller c = Main.controller;
public void setLanguage(){
c.comboBox.setPromptText("New Text"); // This is NOT working!
}
}
更新 1:
Class 主要:
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!
....
但在控制器或语言中 class
System.out.println(Main.controller); // Output: Null
更新 2:
问题似乎是在创建引用之前在 Main 中创建了控制器。
将控制器引用传递给 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!
}
}
我想通过使用我在主函数中创建的引用从控制器外部更改 FXML 元素的文本 class,但我收到 NullPointerException。
Class 控制器:
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!
}
}
Class 语言:
public class Language {
private Controller c = Main.controller;
public void setLanguage(){
c.comboBox.setPromptText("New Text"); // This is NOT working!
}
}
更新 1:
Class 主要:
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!
....
但在控制器或语言中 class
System.out.println(Main.controller); // Output: Null
更新 2:
问题似乎是在创建引用之前在 Main 中创建了控制器。
将控制器引用传递给 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!
}
}