javafx上的重复记录TableView

时间:2015-08-29 18:32:33

标签: javafx nullpointerexception duplicates tableview observablelist

我有这个配置的TableView:

@FXML
private TableView<Budget> budgetTable;
@FXML
private TableColumn<Budget, String> idColumn, budgetNameColumn, buildingColumn, addressColumn, taxableColumn,
        budgetTotalColumn, budgetStateColumn, clientColumn;
@FXML
private TableColumn<Budget, LocalDate> budgetDateColumn;

@FXML
private void initialize() {
    ...
    clientColumn.setCellValueFactory(new Callback<CellDataFeatures<Budget, String>, ObservableValue<String>>() {
        @Override
        public ObservableValue<String> call(CellDataFeatures<Budget, String> data) {
            if (data.getValue().getClient() != null) {
                return data.getValue().getClient().nameProperty().concat(" ")
                        .concat(data.getValue().getClient().surnameProperty());
            }
            return null;
        }
    });
    ...
}
  1. 当应用程序启动时,表格正常。
  2. 当我尝试添加新预算时,我遇到了问题。我将它存储在数据库中,但是在返回主视图时我有一个NullPointerException。
  3. 如果我像代码所示控制此异常,我必须记录相同的新创建预算。
  4. 当我创建一个新预算时,我删除了可观察列表的所有元素,然后我再次填充它,就像第一个一样(可以正常工作)。
  5. 在下图中,最后两个记录是错误记录。它只显示第一个和第二个。
  6. enter image description here

    任何人都可以帮助我吗?

    非常感谢。

2 个答案:

答案 0 :(得分:0)

对于null案例,请返回空StringProperty

clientColumn.setCellValueFactory(new Callback<CellDataFeatures<Budget, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<Budget, String> data) {
        if (data.getValue().getClient() != null) {
            return data.getValue().getClient().nameProperty().concat(" ")
                    .concat(data.getValue().getClient().surnameProperty());
        }
        return new ReadOnlyStringWrapper("");
    }
});

答案 1 :(得分:0)

我找到了一个&#34;解决方案&#34;工作。我不知道为什么它会像那样工作,但此时它的工作原理如下:

clientColumn.setCellValueFactory(new Callback<CellDataFeatures<Budget, String>, ObservableValue<String>>() {
    @Override
    public ObservableValue<String> call(CellDataFeatures<Budget, String> data) {
        if (data.getValue().getClient() != null) {
            return data.getValue().getClient().nameProperty().concat(" ")
                .concat(data.getValue().getClient().surnameProperty());
        } else {
            budgetList.remove(data.getValue());
        }
        return new ReadOnlyStringWrapper("");
    }
});

我只是从observableList中删除了null元素:)