initialize()方法JavaFx NullPointer

时间:2016-12-01 03:59:27

标签: java javafx nullpointerexception

当我试图显示我的数据库信息时,我遇到了一些问题,为什么编译器会给我一个NullPointerException

这是我的控制器,我的代码包含initialize()方法:

    package main;
    import java.net.URL;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ResourceBundle;

    import javax.swing.JComponent;
    import javax.swing.JOptionPane;

    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.event.ActionEvent;
    import javafx.fxml.FXML;
    import javafx.fxml.FXMLLoader;
    import javafx.fxml.Initializable;
    import javafx.scene.Parent;
    import javafx.scene.Scene;
    import javafx.scene.control.ChoiceBox;
    import javafx.scene.control.RadioButton;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.TextArea;
    import javafx.scene.control.TextField;
    import javafx.scene.control.ToggleGroup;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.stage.Stage;

    public class MainWindowController implements Initializable
    {

        public TextField itemType;
        public TextField itemColor;
        public TextField busNum;
        public TextArea txtArea;

        public static TableView<Details> tableView;
        public static TableColumn<Details, String> itemTypeCol;
        public static TableColumn<Details, String> itemColorCol;    
        public static TableColumn<Details, String> description;

        public static ObservableList<Details> data;

        @Override
        public void initialize(URL location, ResourceBundle resources)
        {
            try
            {
                Connection conn = CreatingDerbyDJB.dbConnection();
                data = FXCollections.observableArrayList();

                ResultSet rs = conn.createStatement().executeQuery("select * from Items");
                while(rs.next())
                {
                    data.add(new Details(rs.getString(1), rs.getString(2), rs.getString(3), rs.getString(4)));
                }
            }catch(SQLException ex)     
            {
                System.err.println("Error"  + ex);
            }
            itemTypeCol.setCellValueFactory(new PropertyValueFactory<Details, String>("ItemType"));
            itemColorCol.setCellValueFactory(new PropertyValueFactory<Details, String>("ItemColor"));

            description.setCellValueFactory(new PropertyValueFactory<Details, String>("Description"));

            tableView.setItems(data);
        }
}

这是我的详细信息类,其中包含数据库的详细信息: 包主;

import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;

    public class Details 
    {
        private final StringProperty itemType;
        private final StringProperty itemColor;
        private final StringProperty description;
        private final StringProperty busNum;

        public Details(String itemType, String busNum, String itemColor,String description)
        {
            this.itemType = new SimpleStringProperty(itemType);
            this.itemColor = new SimpleStringProperty(itemColor);
            this.busNum = new SimpleStringProperty(busNum);
            this.description = new SimpleStringProperty(description);

        }

        public String getItemType()
        {
            return itemType.get();
        }

        public void setItemType(String paramItemType)
        {
            itemType.set(paramItemType);
        }

        public String getColor()
        {
            return itemColor.get();
        }

        public void setColor(String paramColor)
        {
            itemColor.set(paramColor);
        }


        public String getDescription()
        {
            return description.get();
        }

        public void setDiscription(String paramDescription)
        {
            description.set(paramDescription);
        }

        public String getBus()
        {
            return busNum.get();
        }
        public void setBus(String paramBus)
        {
            busNum.set(paramBus);
        }


    }

我正在尝试显示数据库的每一列,除了程序中的总线编号,但仍需要用户输入。

2 个答案:

答案 0 :(得分:3)

问题出在initialize(...)方法的这些行上:

itemTypeCol.setCellValueFactory(new PropertyValueFactory<Details, String>("ItemType"));
itemColorCol.setCellValueFactory(new PropertyValueFactory<Details, String>("ItemColor"));

description.setCellValueFactory(new PropertyValueFactory<Details, String>("Description"));

tableView.setItems(data);

所有这四个变量都未初始化,因此null。您不能在null对象上调用setter方法,但需要首先初始化对象。您可以使用new关键字对它们进行初始化,但正如@jewelsea所指出的那样,对于FX应用程序来说,这不是一个很好的做法。

最好使用@FXML注释来注入基于FXML配置的依赖项。为此,您还应该从变量中删除静态关键字。

您的FXML文件中必须包含以下内容:

<TableView fx:id="tableView">
  <columns>
    <TableColumn text="ItemType" fx:id="itemTypeCol" />
    <TableColumn text="ItemColor" fx:id="itemColorCol" />
    <TableColumn text="Description" fx:id="description" />
  </columns>
</TableView>

然后你可以在控制器中执行此操作:

@FXML // fx:id="tableView"
public TableView<Details> tableView;
@FXML // fx:id="itemTypeCol"
public TableColumn<Details, String> itemTypeCol;
@FXML // fx:id="itemColorCol"
public TableColumn<Details, String> itemColorCol;
@FXML // fx:id="description"
public TableColumn<Details, String> description;

这样,JavaFX框架将实例化您在标记中描述的所有上述内容,然后将这些组件注入您的控制器。

答案 1 :(得分:1)

您发布的代码存在许多问题:

  1. 不要在JavaFX代码中使用javax.swing组件。
  2. 请勿使用static references in FXML controllers
  3. 使用@FXML注入具有匹配fx:ids的对象实例。
  4. PropertyValueFactory的字符串参数的第一个字母应为小写。
  5. 当您发布与FXML相关的问题时,您还应该在问题中包含FXML。

    您的实施也可能存在其他问题。