2016-06-07 111 views
-1

我製作了一張簡單的表格,用戶可以在其中搜索書籍併購買它。在一個場景中有搜索標籤,並且當點擊搜索按鈕時,新的場景以表格中的搜索結果打開。問題是,當我輸入例如要搜索的書名時,它會顯示在表格中,但是當我返回時,輸入新書名進行搜索時,表格中會有與之前搜索相同的單元格。我希望舊的搜索記錄在我輸入新的搜索參數時不顯示。我不使用JavaFX屬性,因爲我從服務器獲取書籍,並且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); 
+1

另外:僅僅因爲JavaFX屬性不是'Serializable',它並不意味着你的模型類不能使用它們。通過實現'readObject'和'writeObject'方法來使用自定義序列化。參見例如[here](http://www.oracle.com/technetwork/articles/java/javaserial-1536170.html)或[here](http://stackoverflow.com/questions/35039557/javafx-and-serializability)。 (還有......不是每個人都只是用最近的JSON與服務器通信嗎?) –

+0

是的,他們這樣做。問題是我不能使用JSON,因爲它不適用於我的應用程序。 (大學項目)。 – MGKP

+0

夠公平的。無論如何,請考慮使用JavaFX屬性,它使控件能夠更好地發揮作用。 –

回答

1

你應該空出的文本&圖形時,細胞是空的,它會清除先前填充細胞。就你而言,圖形就夠了。

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

我已經嘗試過了。什麼都沒發生。 http://prntscr.com/bdndut – MGKP

+0

@Mogogic如果這不起作用,您可能需要創建一個[MCVE]並編輯您的問題以包含它。 –

+1

@Magicic - 當單元格爲空時('item == null'),您顯然不會將圖形設置爲null。您可能只包含'cell.setGraphic(null);'where item == null'。 – Zsolt

1

問題解決了。事情是,當我從服務器發送圖書的ArrayList到客戶端時,我沒有清除列表,所以服務器發送新舊對象。