我有此控制器类用于在TableView中显示数据库查询,但是我在NullPointerException错误中出现了“ setCellValueFactory(new PropertyValueFactory”)
package aplicativo; import java.net.URL; import java.util.ResourceBundle; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.fxml.Initializable; import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.control.cell.PropertyValueFactory; public class Controle implements Initializable{ @FXML private TextField txtCampo,txtCampo2; @FXML private Button btAdicionar,btConsultar; @FXML private TableView<Pessoa> tabValues; @FXML private TableColumn<Pessoa, Integer> tbcCod; private TableColumn<Pessoa, String>tbcNome; ObservableList<Pessoa> List = FXCollections.observableArrayList(); @FXML private void btAdd(){ insertBD a = new insertBD(txtCampo.getText()); consultaBD b = new consultaBD(); List = b.consultaTudo(); tabValues.setItems(List); txtCampo.clear(); } @FXML private void btCons(){ String tx = txtCampo2.getText(); if(tx.isEmpty()){ }else{ consultaBD a = new consultaBD(); a.consultaParecido(tx, "nome"); txtCampo2.clear(); } } @Override public void initialize(URL arg0, ResourceBundle arg1) { // TODO Auto-generated method stub tbcCod.setCellValueFactory(new PropertyValueFactory<Pessoa, Integer>("cod")); tbcNome.setCellValueFactory(new PropertyValueFactory<Pessoa, String>("nome")); tabValues.setItems(List); tabValues.getColumns().addAll(tbcCod,tbcNome); } }
NullPointerExcepetion:
Exception in Application start method java.lang.reflect.InvocationTargetException at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source) at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) at java.lang.reflect.Method.invoke(Unknown Source) at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source) Caused by: java.lang.RuntimeException: Exception in Application start method at com.sun.javafx.application.LauncherImpl.launchApplication1(Unknown Source) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$152(Unknown Source) at com.sun.javafx.application.LauncherImpl$$Lambda$50/1645995473.run(Unknown Source) at java.lang.Thread.run(Unknown Source) Caused by: javafx.fxml.LoadException: /C:/Users/lucas/workspace/BDFX/bin/aplicativo/Tela.fxml at javafx.fxml.FXMLLoader.constructLoadException(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.loadImpl(Unknown Source) at javafx.fxml.FXMLLoader.load(Unknown Source) at aplicativo.Main.start(Main.java:13) at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(Unknown Source) at com.sun.javafx.application.LauncherImpl$$Lambda$53/1031257736.run(Unknown Source) at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(Unknown Source) at com.sun.javafx.application.PlatformImpl$$Lambda$45/186276003.run(Unknown Source) at com.sun.javafx.application.PlatformImpl.lambda$null$170(Unknown Source) at com.sun.javafx.application.PlatformImpl$$Lambda$48/1529876784.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(Unknown Source) at com.sun.javafx.application.PlatformImpl$$Lambda$47/237061348.run(Unknown Source) at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source) at com.sun.glass.ui.win.WinApplication._runLoop(Native Method) at com.sun.glass.ui.win.WinApplication.lambda$null$145(Unknown Source) at com.sun.glass.ui.win.WinApplication$$Lambda$36/2117255219.run(Unknown Source) ... 1 more Caused by: java.lang.NullPointerException at aplicativo.Controle.initialize(Controle.java:52) ... 23 more Exception running application aplicativo.Main
有什么办法吗?
控制器中的实例字段之一缺少@FXML注释。由于该字段是私有字段,因此FXML加载程序无法在加载过程中将控件引用注入到该字段中。这是您的实例字段声明:
@FXML
@FXML private TextField txtCampo,txtCampo2; @FXML private Button btAdicionar,btConsultar; @FXML private TableView<Pessoa> tabValues; @FXML private TableColumn<Pessoa, Integer> tbcCod; private TableColumn<Pessoa, String>tbcNome;
请注意,最后一个字段tbcNome没有注释。结果,当调用您的initialize方法时,该tbcNome字段包含一个null引用,从而导致异常。
tbcNome
null
要解决您的问题,您可能需要做的就是将@FXML注释添加到的实例字段声明中tbcNome。
您可能通过养成在类型声明中列出多个变量的习惯而鼓励了该错误,例如。private Button btAdicionar, btConsultar;。在我看来,这是一种不良习惯,会助长此类错误的发生。我建议您尝试采用每个实例字段都有其自己的类型声明语句的编码样式。
private Button btAdicionar, btConsultar;