0

我有这样的TableView此配置:复制的记录的TableView对JavaFX的

@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. 在下图中,最后两个记录是坏记录。它只会显示第一个和第二个。

enter image description here

谁能帮助我?

非常感谢。

+0

您是否使用了自定义的'cellFactory'删除空元素,以及你展示的'cellValueFactory'? –

+0

我没有使用cellFactory,只是像代码显示那样设置了列。 –

回答

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(""); 
    } 
}); 
+0

它不起作用,它具有相同的行为。当我创建一个新的预算时,当我回到主视图时,它显示了新的两个记录,一个与客户端,另一个没有它。 –

0

我发现了一个“解决方案”的工作。我真的不知道它为什么那样工作,但在这一刻它的工作原理是:

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 :)

+0

这听起来像是你的代码中有一些与这个单元格工厂无关的其他错误:除非你修复它,否则你可能会遇到问题。 –

+0

也许但我找不到它......可能会出现在其他相关的东西中......我会告诉你的!谢谢 –