В результате настройки поля со списком JavaFX указывается нулевой указатель - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть небольшой графический интерфейс, в котором я выбираю элемент в первом комбинированном списке, который заполняет второй комбинированный список данными, а также изменяет текст двух меток.

Все работает, как ожидается, когда я впервые выбираю первый комбинированный список(combobox_suppliers), а затем второй combobox (combobox_radio), а также обновляет две метки (label_rad_substance, label_halftime).Но если я тогда попробую выбрать новую опцию снова из первого списка, я получу много ошибок и исключений нулевого указателя в журнале.(Программа все еще продолжает функционировать).

Журнал ошибок довольно длинный, но эта строка выглядит одной из проблем:

label_rad_substance.setText(newValue.getSubstance().getName());

Это код:

package gui;

import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.ResourceBundle;

import dao.RadiopharmaceuticalDao;
import dao.SupplierDao;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import model.Radiopharmaceutical;
import model.Room;
import model.Supplier;

public class Controller implements Initializable {

    private ObservableList<Supplier> supplierList = FXCollections.observableArrayList();
    private ObservableList<Radiopharmaceutical> radioList = FXCollections.observableArrayList();

    public DatePicker ankomstdatum = new DatePicker();
    public DatePicker kalibreringsdatum = new DatePicker();

    public ComboBox<Supplier> combobox_suppliers = new ComboBox<>();
    public ComboBox<Radiopharmaceutical> combobox_radio = new ComboBox<>();
    public ComboBox<Room> combobox_room = new ComboBox<>();

    public Label label_rad_substance = new Label();
    public Label label_halftime = new Label();

    public TextField text_kalibreringsaktivitet = new TextField();
    public TextField text_kalibreringstid = new TextField();
    public TextField text_batchnr = new TextField();
    public TextField text_kommentar = new TextField();
    public ListView<String> listView = new ListView<String>();

    public CheckBox check_kontamineringskontroll = new CheckBox();
    public Button button = new Button();



    public void addSuppliersToComboBox() {
        supplierList.addAll(new SupplierDao().getAll());
        combobox_suppliers.getItems().addAll(supplierList);
    }






    @Override
    public void initialize(URL location, ResourceBundle resources) {
        addSuppliersToComboBox();
        ankomstdatum.setValue(LocalDate.now());
        combobox_radio.setDisable(true);

        combobox_suppliers.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) ->{
            combobox_radio.getItems().clear();
            combobox_radio.getItems().addAll(FXCollections.observableArrayList(new RadiopharmaceuticalDao().getRadiopharmaceuticalsBySupplierName(newValue.toString())));
            combobox_radio.setDisable(false);
            combobox_radio.getSelectionModel().selectFirst();
        });

        combobox_radio.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue)->{
            label_rad_substance.setText(newValue.getSubstance().getName());
            label_halftime.setText(newValue.getSubstance().getHalfLife()+"");
        });
    }


}

1 Ответ

0 голосов
/ 07 декабря 2018
combobox_radio.getItems().clear();

Удаляет все предметы.Элементы, которых нет в списке items из ComboBox, не могут быть выбраны.По этой причине оператор приводит к тому, что выбранный элемент combo_radio становится null, что приводит к NullPointerException при попытке разыменования null в newValue.getSubstance().

Необходимо добавить проверку дляnull чтобы это исправить, например

combobox_radio.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue)->{
    if (newValue == null) {
        label_rad_substance.setText("");
        label_halftime.setText("");
    } else {
        label_rad_substance.setText(newValue.getSubstance().getName());
        label_halftime.setText(newValue.getSubstance().getHalfLife()+"");
    }
});

Кстати: я не рекомендую инициализировать введенные поля.Если эти поля введены правильно, вы создали Node s, которые никогда не используются.Если это не так, лучше сразу получить исключение, которое указывает, что инъекция не работает, вместо того, чтобы выяснить, почему некоторые изменения в Node не влияют на графический интерфейс ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...