Javafx setCellValueFactory:NullpointerException

时间:2017-06-21 09:19:35

标签: java javafx nullpointerexception java-8 javafx-8

让我们考虑以下代码:

package stackoverflow;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.util.StringConverter;

import java.net.URL;
import java.util.ResourceBundle;

public class TestController implements Initializable {

    @FXML
    private TableView<TestRow> table;
    @FXML
    private TableColumn<TestRow, String> myColumn;

    @Override
    public void initialize(URL location, ResourceBundle resources) {

        table.setEditable(true);

        myColumn.setCellValueFactory(data ->data.getValue().nameProperty());
        myColumn.setCellFactory(factory -> new TextFieldTableCell<>(new StringConverter<String>() {
            @Override public String toString(String object) {
                return object;
            }

            @Override public String fromString(String string) {
                return string;
            }
        }));
        myColumn.setPrefWidth(200);

        table.getItems().add(new TestRow("Name1"));
        table.getItems().add(new TestRow("Name2"));
    }
}

当我想在Name列中编辑单元格并且我不知道为什么时,我在第NullpointerException行获得了myColumn.setCellValueFactory(data->data.getValue().nameProperty());,我输入了debug并且它表示data.getValue()是null,所以很明显我在应用NPE时得到.nameProperty()。问题是什么时候可以将数据置空?为什么?我想弄清楚,但我根本找不到任何东西。在调试中我正在寻找data.getTableView()。getItems()并返回添加的两行。您是否知道为什么data.getValue()(必须返回TestRow包含的现有table实例)?

1 个答案:

答案 0 :(得分:0)

我有同样的问题,我总是通过检查空值来修复它。

我的猜测是,当TableRow接收到空值时,它仍然必须以某种方式显示为图形组件,Cell和ValueFactory也是如此调用(您可能希望在空行上显示自定义值)。