簡體   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