java JavaFX设置组合框会导致空指针
我有一个小gui,我在第一个组合框中选择一个项目,它用数据填充第二个组合框,并更改两个标签的文本
当我第一次选择第一个组合框(组合框\供应商),然后选择第二个组合框(组合框\无线电),并且它还更新了两个标签(标签\无线电\物质,标签\中场休息)时,一切正常。但是如果我再次尝试从第一个组合框中选择一个新选项,我会在日志中看到很多错误和空指针异常。(程序仍在继续运行)
错误日志相当长,但这一行可能是问题之一:
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 楼答案
删除所有项目。不在
items
列表ComboBox
中的项目没有资格被选择。由于这个原因,该语句导致所选的combo_radio
项变成null
,当试图在newValue.getSubstance()
中取消对null
的引用时,结果是NullPointerException
你需要为
null
添加一个检查来解决这个问题,例如顺便说一句:我不建议初始化注入的字段。如果这些字段被正确注入,那么您就创建了
Node
个从未使用过的字段。如果没有,最好立即得到一个异常,表明注入不起作用,而不是必须找出为什么对Node
的某些更改不会影响GUI