我正在编写一个简单的应用程序,该功能可以统计功能中的饮料计数。我正在使用Java并用FXML编写GUI。
我遇到的一个问题是,除非我通过处理程序方法与之交互,否则所有@FXML对象都为null。
@FXML
private Label directoryLabel; // the label in question
public SettingsWindow() {
super();
}
@Override
protected void Refresh() {
PriorityLogger.Log("Settings Window Refreshed.", PriorityLogger.PriorityLevel.Low);
// returns a null pointer exception
directoryLabel.setText(ApplicationSettings.GetInstance().GetTextFileDirectory());
}
@FXML
public void HandleDirectoryChangeButton(ActionEvent event) {
PriorityLogger.Log("Handling directory change", PriorityLogger.PriorityLevel.Low);
// works perfectly fine
directoryLabel.setText(ApplicationSettings.GetInstance().GetTextFileDirectory());
}
如您在上面看到的,尝试通过Refresh()方法更改文本;在计时器上调用它会导致空指针异常。但是,如果我尝试通过按钮上的handler方法更改文本,则一切正常。
这是一个令人困扰的问题,它将在整个应用程序开发过程中影响我,而我正努力寻找具体的解决方法或解释其原因。
有人可以帮助我吗?
谢谢, 康纳。
更新:
这是我获取实例的方式:
public class WindowLoader<T extends Window> {
public T NewWindow(String fxml, Class<T> windowClass) throws InstantiationException, IllegalAccessException {
Stage stage = new Stage();
return NewWindow(fxml, windowClass, stage);
}
public T NewWindow(String fxml, Class<T> windowClass, Stage stage) throws InstantiationException, IllegalAccessException {
try {
Parent root = FXMLLoader.load(getClass().getResource(fxml));
Scene scene = new Scene(root);
stage.setScene(scene);
} catch (IOException ex) {
PriorityLogger.Log("ERROR: Window Loader couldn't load your window - " + ex.toString(), PriorityLogger.PriorityLevel.High);
}
T t = windowClass.newInstance();
t.SetStage(stage);
return t;
}
}
private void SetupSettingsWindow() {
WindowLoader windowLoader = windowLoaderFactory.getWindowLoader();
try {
settingsWindow = (SettingsWindow) windowLoader.NewWindow("SettingsWindowFXML.fxml", com.albinodevelopment.View.SettingsWindow.class);
settingsWindow.start();
} catch (InstantiationException | IllegalAccessException ex) {
PriorityLogger.Log("ERROR; Couldn't load settings window for some reason - " + ex.toString(), PriorityLogger.PriorityLevel.High);
}
}
当他们按下菜单栏上的按钮时,就会从我的MainWindow中调用SetupupSettingsWindow。