首页 文章

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

提问于
浏览
-1

我制作了一个简单的表格,用户可以搜索书籍并购买 . 在一个场景中有搜索标签,并且当单击搜索按钮时,将打开新场景,其中搜索结果在表格中 . 问题是,当我输入例如搜索的书名时,它显示在表格中,但是当我回去,并且输入新书名称进行搜索时,表格中的单元格与之前的搜索并排在一起 . 我希望在输入新的搜索参数时不显示旧的搜索记录 . 我不使用JavaFX属性,因为我从服务器获取书籍,而JavaFX属性不可序列化 . 这就像 table 不爽 . 我试图从这个网站的类似问题实现代码,但没有结果 . 我的表的代码(最后一列是复选框) .

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

2 回答

  • 1

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

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

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

相关问题