prumin
@prumin
Изучаю Java и мобильную разработку

Почему контроллер окна не видит список из главного класса?

В общем. Такая ситуация.
Передаю из главного класса в класс-контроллер окна настроек список, с установленными за ранее в главном классе значениями через конструктор. Вот код класса main:
public class MainClass extends Application {
	
	private Stage primaryStage;
	private BorderPane rootLayout;
	private Settings settings;
	
	
	@Override
	public void start(Stage primaryStage) {
		this.primaryStage = primaryStage;
		this.primaryStage.setTitle("Антикафе");
		
		initRootLayout();
		showPersonOverview();
	}
	
	 private ObservableList<Settings> Data = FXCollections.observableArrayList();
	
	public MainClass() {
		Data.add(new Settings(false,false,false,false));
	}
	
	public ObservableList<Settings> getData() {
        return Data;
    }
	 public boolean showSettingsDialog() {
		    try {
		        // Загружаем fxml-файл и создаём новую сцену
		        // для всплывающего диалогового окна.
		        FXMLLoader loader = new FXMLLoader();
		        loader.setLocation(MainClass.class.getResource("view/settings.fxml"));
		        AnchorPane page = (AnchorPane) loader.load();

		        // Создаём диалоговое окно Stage.
		        Stage dialogStage = new Stage();
		        dialogStage.setTitle("Настройки");
		        dialogStage.initModality(Modality.WINDOW_MODAL);
		        dialogStage.initOwner(primaryStage);
		        Scene scene = new Scene(page);
		        dialogStage.setScene(scene);
		        
		        
		     // Передаём список настроек в контроллер.
		        ButtonSettingsControll controller = loader.getController();
		        controller.setDialogStage(dialogStage);
		        controller.setData(Data);
		        controller = new ButtonSettingsControll(Data);
		        
		        // Отображаем диалоговое окно и ждём, пока пользователь его не закроет
		        dialogStage.showAndWait();
		        return true;
		    } catch (IOException e) {
		        e.printStackTrace();
		        return false;
		    }
		}
}


Вот код самого контроллера:

public class ButtonSettingsControll {
	
		private Stage dialogStage;
		@FXML
		public CheckBox checkKal;
		@FXML
		public CheckBox checkStopCheck;
		@FXML
		public CheckBox checkTea;
		@FXML
		public CheckBox checkVIP;
		@FXML
		public TextField kalHard;
		@FXML
		public TextField kalNorm;
		@FXML
		public TextField kalLight;
		@FXML
		public TextField priceTea;
		@FXML
		public TextField priceUnd;
		@FXML
		public TextField peoplsUndo;
		@FXML
		public TextField priceTo;
		@FXML
		public TextField peoplsTo;
		@FXML
		public TextField priceStopCheck;
		
		private MainClass mainClass;
		private ObservableList<Settings> Data = FXCollections.observableArrayList();
		
		public void setMain(MainClass mainClass) {
			this.mainClass = mainClass;
		}
		public void setData(ObservableList<Settings> data) {
			Data = data;
		}
		
                //Пока не разберусь со списком для наглядности буду использовать это
		Boolean CK = false;
		Boolean CT = false;
		Boolean CV = false;
		Boolean CC = false;
		
		public void setDialogStage(Stage dialogStage) {
	        this.dialogStage = dialogStage;
	    }
		
		public ButtonSettingsControll() {
		}
		public ButtonSettingsControll(ObservableList<Settings> data) {
			Data = data;
			System.out.println(Data.get(0).getCheckK());
			checkKal.setSelected(data.get(0).getCheckK());
			
		}
		
		@FXML
	    private void initialize() {
			if(CK)
				checkKal.setSelected(true);
			else {
				checkKal.setSelected(false);
				kalHard.setDisable(true);
				kalNorm.setDisable(true);
				kalLight.setDisable(true);
			}
			if(CT)
				checkTea.setSelected(true);
			else {
				checkTea.setSelected(false);
				priceTea.setDisable(true);
			}
			if(CV)
				checkVIP.setSelected(true);
			else {
				checkVIP.setSelected(false);
				priceUnd.setDisable(true);
				priceTo.setDisable(true);
				peoplsTo.setDisable(true);
				peoplsUndo.setDisable(true);
			}
			if(CC)
				checkStopCheck.setSelected(true);
			else {
				checkStopCheck.setSelected(false);
				priceStopCheck.setDisable(true);
			}
		}
		
		@FXML
		private void settings() {
			Data.setAll(new Settings(checkKal.isSelected(),checkTea.isSelected(),checkVIP.isSelected(),checkStopCheck.isSelected()));
			System.out.println(Data.get(0).getCheckK());
	        dialogStage.close();
		}
}


Не могу понять, почему мне выдает исключение (java.lang.NullPointerException), при вызове окна настроек.
Исключение появляется вот в этом блоке:
public ButtonSettingsControll(ObservableList<Settings> data) {
			Data = data;
			System.out.println(Data.get(0).getCheckK());
			checkKal.setSelected(Data.get(0).getCheckK());
			
		}

А именно тут
checkKal.setSelected(data.get(0).getCheckK());
.
Вывод в консоль срабатывает, (для проверки сделал) но когда я пытаюсь использовать то же самое значение для установки флажка в чекбоксе - программа падает из-за этого исключения. Подскажите плз что не так.
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
здесь ошибка .
// Передаём список настроек в контроллер.
            ButtonSettingsControll controller = loader.getController();
            controller.setDialogStage(dialogStage);
            controller.setData(Data);
            controller = new ButtonSettingsControll(Data);

здесь
ButtonSettingsControll controller = loader.getController();
получили ссылку на контроллер из лоадера.
, а здесь controller = new ButtonSettingsControll(Data); создали новый объект, не связанные с загруженным FXML

И еще. Когда вызывается конструктор контроллера элементы управления объявленные с аннотацией @FXML еще не созданы. Поэтому такой конструктор не имеет смысла. А лоадер вызывает конструктор по-умолчанию( тот который без параметров). Значит либо после получения ссылки из лоадера на контроллер Вы вызываете его метод setData и что угодно еще и заполняете элементы управления данными. Либо создаете контроллер и передаете ссылку на него в лоадер и затем вызываете метод контроллера, в котором заполняете свои элементы управления данными.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы