表中的JavaFX旧单元格显示为新单元格

表中的JavaFX旧单元格显示为新单元格,java,javafx,Java,Javafx,我制作了一个简单的表格,用户可以在其中搜索书籍并购买。在一个场景中有一个搜索标签,然后,当单击“搜索”按钮时,将打开新场景,并在表中显示搜索结果。问题是,当我输入例如要搜索的图书名称时,它会显示在表中,但当我返回并输入要搜索的新书名称时,表中的单元格中有上一次搜索和新搜索。我希望在输入新的搜索参数时不显示旧的搜索记录。我不使用JavaFX属性,因为我从服务器获取书籍,并且JavaFX属性不可序列化。好像桌子不新鲜。我曾尝试从这个站点的类似问题中实现代码,但没有结果。 “我的表”的代码(最后一列为

我制作了一个简单的表格,用户可以在其中搜索书籍并购买。在一个场景中有一个搜索标签,然后,当单击“搜索”按钮时,将打开新场景,并在表中显示搜索结果。问题是,当我输入例如要搜索的图书名称时,它会显示在表中,但当我返回并输入要搜索的新书名称时,表中的单元格中有上一次搜索和新搜索。我希望在输入新的搜索参数时不显示旧的搜索记录。我不使用JavaFX属性,因为我从服务器获取书籍,并且JavaFX属性不可序列化。好像桌子不新鲜。我曾尝试从这个站点的类似问题中实现代码,但没有结果。 “我的表”的代码(最后一列为复选框)

TableView table=newtableview();
可观测数据=
FXCollections.observableArrayList(列表);
table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_策略);
TableColumn名称col=新的TableColumn(“Naziv”);
TableColumn authorCol=新的TableColumn(“自动”);
TableColumn costCol=新的TableColumn(“Cijena”);
回收工厂;
TableColumn checkCol=新TableColumn();
表2.设置项目(数据);
nameCol.setCellValueFactory(新属性ValueFactory(“bookName”);
authorCol.setCellValueFactory(新属性值工厂(“authorName”);
costCol.setCellValueFactory(新属性ValueFactory(“成本”);
checkCol.setCellValueFactory(新属性ValueFactory(“选中”);
cellFactory=新回调(){
@凌驾
公共TableCell调用(最终TableColumn参数){
最终复选框=新复选框();
最终TableCell单元格=新TableCell(){
@凌驾
public void updateItem(对象项,布尔值为空){
super.updateItem(项,空);
如果(项==null){
复选框.setDisable(true);
复选框.setSelected(false);
}否则{
复选框.setDisable(false);
复选框.setSelected(项等于(真)?真:假);
复选框.selectedProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observevalue当单元格为空时,您应该清空文本和图形,它将清除以前填充的单元格。在您的情况下,图形就足够了

@Override
public void updateItem(Object item, boolean empty) {
    super.updateItem(item, empty);
    if (empty) {
        setText(null);
        setGraphic(null);
    } else {
        // do stuff here
    }
}

问题解决了。问题是,当我将书籍的ArrayList从服务器发送到客户端时,我没有清理列表,所以服务器发送新旧对象。

旁白:仅仅因为JavaFX属性不可
序列化,并不意味着使用它们的模型类不能序列化。只需通过实现
readObje来使用自定义序列化即可ct
writeObject
方法。请参见,例如,或。(另外……现在不是每个人都只使用JSON与服务器通信吗?)是的,他们使用JSON。问题是我不能使用JSON,因为我的应用程序不允许使用JSON。(大学项目)公平的。无论如何,考虑使用JavaFX属性,它使事情在控件上发挥得更好。@ MGOIC如果它不起作用,你可能需要创建一个并编辑你的问题来包含它。@ MGOGIC——当单元是空的时,你显然不将图形设置为<代码> null <代码>(<代码>项目=空NU/COD>)您可以只包含
cell.setGraphic(null);
where
item==null
。在这种情况下,编译器说变量单元格可能没有初始化。我认为这不仅仅是复选框列的问题,其他列也有问题@James_D我今天将这样做。
@Override
public void updateItem(Object item, boolean empty) {
    super.updateItem(item, empty);
    if (empty) {
        setText(null);
        setGraphic(null);
    } else {
        // do stuff here
    }
}