繁体   English   中英

表中的JavaFX旧单元格与新单元格一起显示

[英]JavaFX old cells in table are shown with new one

我做了一个简单的表,用户可以在其中搜索书籍并购买。 在一个场景中有搜索标签,然后,当单击搜索按钮时,将打开一个新场景,并在表中显示搜索结果。 问题是,例如,当我输入要搜索的书名时,它显示在表格中,但是当我返回并输入新书名进行搜索时,表中的单元格中有前一个搜索和新搜索。 而且我希望在输入新的搜索参数时不显示旧的搜索记录。 我不使用JavaFX属性,因为我从服务器获取书籍,并且JavaFX属性不可序列化。 就像表没有刷新一样。 我曾尝试从该站点的类似问题中实施代码,但没有结果。 我的表格的代码(最后一栏是复选框)。

            TableView<Knjiga> table = new TableView<Knjiga>();
            ObservableList<Knjiga> data =
            FXCollections.observableArrayList(list);

            table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); 
            TableColumn<Knjiga, String> nameCol = new TableColumn<Knjiga, String>("Naziv");
            TableColumn<Knjiga, String> authorCol = new TableColumn<Knjiga, String>("Autor");
            TableColumn<Knjiga, String> costCol = new TableColumn<Knjiga, String>("Cijena");
            Callback<TableColumn<Knjiga, Boolean>, TableCell<Knjiga, Boolean>> cellFactory;
            TableColumn checkCol= new TableColumn<Knjiga, Boolean>();
            table.setItems(data);
            nameCol.setCellValueFactory(new PropertyValueFactory<Knjiga, String>("bookName"));
            authorCol.setCellValueFactory(new PropertyValueFactory<Knjiga, String>("authorName"));
            costCol.setCellValueFactory(new PropertyValueFactory<Knjiga, String>("cost"));
            checkCol.setCellValueFactory(new PropertyValueFactory<Knjiga, Boolean>("checked"));                 
            cellFactory = new Callback<TableColumn<Knjiga, Boolean>, TableCell<Knjiga, Boolean>>() {
            @Override
            public TableCell call(final TableColumn param) {
                 final CheckBox checkBox = new CheckBox();
                 final TableCell cell = new TableCell() {

                @Override
                public void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);
                    if (item == null) {
                        checkBox.setDisable(true);
                        checkBox.setSelected(false);
                    } else {
                        checkBox.setDisable(false);
                        checkBox.setSelected(item.equals(true) ? true : false);
                        checkBox.selectedProperty().addListener(new ChangeListener<Boolean>() {
                            @Override
                            public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
                                for(int i = 0; i < fromServer.size(); i++)
                                    fromServer.get(i).setQuantity(fromServer.get(i).getQuantity() - 1);
                            }
                       });
                    commitEdit(checkBox.isSelected() ? true : false);
                    }
                }
            };
            cell.setGraphic(checkBox);
            refresh(table, data);
            return cell;
        }
    };      
            checkCol.setCellValueFactory(new PropertyValueFactory("checked")); 
            checkCol.setCellFactory(cellFactory);

当单元格为空时,您应该使文本和图形无效,这将清除以前填充的单元格。 就您而言,图形就足够了。

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

问题解决了。 事实是,当我从服务器向客户端发送Books ArrayList时,我没有清除列表,因此服务器发送了旧对象和新对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM