让我们考虑以下代码:
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
实例)?
答案 0 :(得分:0)
我有同样的问题,我总是通过检查空值来修复它。
我的猜测是,当TableRow接收到空值时,它仍然必须以某种方式显示为图形组件,Cell和ValueFactory也是如此调用(您可能希望在空行上显示自定义值)。