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());
.
Вывод в консоль срабатывает, (для проверки сделал) но когда я пытаюсь использовать то же самое значение для установки флажка в чекбоксе - программа падает из-за этого исключения. Подскажите плз что не так.
  • Вопрос задан
  • 306 просмотров
Решения вопроса 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 и что угодно еще и заполняете элементы управления данными. Либо создаете контроллер и передаете ссылку на него в лоадер и затем вызываете метод контроллера, в котором заполняете свои элементы управления данными.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект