Nullpointerexeption при запуске Popupwindow с установленными значениями по умолчанию, в противном случае это работает - PullRequest
0 голосов
/ 08 мая 2019

Когда я открываю всплывающее окно по событию кнопки из главного контроллера появляется всплывающее окно, и все выглядит идеально. Но когда я пытаюсь установить данные в выпадающих списках или текстовых полях

PopUpPersController:

public PopUpPersController() {
    initialize();
}
private void initialize() {
    txtMa_LohnGesKum.setText("1200.12");
}

и нажмите кнопку, чтобы открыть всплывающее окно, я получаю исключение нулевого указателя.

maincontroller называется Projektcontroller, связанный FXML-file называется Projekt.fxml Контроллер всплывающего окна называется «PopUpPersController», связанный FXML-file называется PersCalc.fxml. Все элементы имеют fxId. Я думал, что заполнение комбинированных списков или текстовых полей с defaultdata будет работать так же, как в Maincontroller ... Я не нашел ответа на этот вопрос.

Я новичок в Java, поэтому большое спасибо за вашу помощь и наилучшие пожелания Marcus

Код из Main или ProjectController для кнопки, открывающей всплывающее окно:

@FXML
void onAction_Test(ActionEvent event) {
    try {
        Parent root1 = FXMLLoader.load(getClass().getResource("/ui/fxml/PersCalc.fxml"));
        Stage persStage = new Stage();
        persStage.setTitle("Personalkosten-Rechner");
        persStage.setScene(new Scene(root1));
        persStage.show();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Я попытался определить основные ошибки:

  1. javafx.fxml.LoadException в PersCalc.fxml

Код в этой строке:

<BorderPane xmlns="http://javafx.com/javafx/10.0.1"xmlns:fx="http://javafx.com/fxml/1" fx:controller="ui.controller.PopUpPersController">

2. Из события кнопки в ProjectController (см. Выше) Код в этой строке:

Parent root1=FXMLLoader.load(getClass().getResource("/ui/fxml/PersCalc.fxml"));

3. Назначение данных для textfield

Вызывается: java.lang.NullPointerException at ui.controller.PopUpPersController.initialize (PopUpPersController.java:123)

Код в этой строке (см. Выше initialize()):

 txtMa_LohnGesKum.setText("1200.12");

1 Ответ

2 голосов
/ 09 мая 2019

Загрузка fxml, содержащего атрибут fx:controller, приводит к FXMLLoader с использованием конструктора, принимающего 0 аргументов, для создания экземпляра класса контроллера.Конструктор вызывается до того, как какое-либо из полей будет введено, что приводит к NullPointerException, даже если поля доступны для FXMLLoader, а файл fxml содержит надлежащие атрибуты fx:id.

Предполагается, что вы установиливверх по полю / fx:id правильно, делая метод initialize видимым для FXMLLoader вместо вызова initialize из конструктора, это должно решить проблему:

public PopUpPersController() {
}

@FXML // you need this annotation for non-public members to be visible to FXMLLoader
private void initialize() {
    txtMa_LohnGesKum.setText("1200.12");
}

Убедитесь, что поля FXMLLoaderдолжны быть также помечены @FXML (или public), а обязательные атрибуты fx:id установлены в файле fxml.

...