2017-10-10 136 views
-1

我最近遇到了一個有趣的問題。我有一個表有1個int和3個字符串列。我已經實現了對錶格的過濾,除了一個小點之外,它完美地工作正常:每當至少有一個過濾結果(但少於可見行的數量)時,int列顯示爲空行值。如果找到的匹配數量大於可見的行數,則不會添加空值(即使使用滾動功能)。這最好與圖片說明:JavaFX TableView顯示空值

爲不存在的值

with null values

過濾器不顯示空值:

FilteredList<Word> filteredData = new FilteredList<>(masterData,e->true); 
    SortedList<Word> sortedData = new SortedList<>(filteredData); 
    sortedData.comparatorProperty().bind(table.comparatorProperty()); 
    table.setItems(sortedData); 
    TextField filter = new TextField(); 
    filter.setPromptText("Filter"); 
    filter.textProperty().addListener((observableValue,oldValue,newValue)->{ 
     filteredData.setPredicate((Predicate<? super Word>) word->{ 
      if(word.getAllCz().toLowerCase().contains(newValue.toLowerCase()))return true; 
      else if(word.getAllEng().toLowerCase().contains(newValue.toLowerCase()))return true; 
      else if(String.valueOf(word.getUnitNo()).equals(newValue))return true; 
      else return false; 
     }); 
    }); 

CellValue:

without null values

用於濾波的代碼工廠:

column.setCellValueFactory(new PropertyValueFactory<>(data)); 
    column.setCellFactory(tc-> { 
     TableCell<Word, Integer> cell = new TableCell<>(); 
     Text text = new Text(); 
     cell.setGraphic(text); 
     text.setTextAlignment(TextAlignment.CENTER); 
     text.setStyle("-fx-fill: -fx-text-background-color;"); 
     text.setFontSmoothingType(FontSmoothingType.LCD); 
     text.wrappingWidthProperty().bind(column.widthProperty().subtract(5)); 
     text.textProperty().bind(cell.itemProperty().asString()); 
     return cell; 
    }); 
+0

請包括設置第一列的cellValueFactory的代碼。 – VGR

+1

您是否在該列上有自定義單元工廠?如果是這樣,請發佈。另外:你是否意識到你不斷地在文本字段的文本屬性中添加越來越多的監聽器?最終這會使應用程序停滯不前。每次文本更改時,也不需要創建新的排序列表。 –

+0

我已經添加了一個cellValueFactory。 James_D感謝你指出了這一點..我還是新來的,所以我沒有注意到。 – zotmer

回答

1

如果該單元是空的,它的項將是null,和itemProperty().asString()將評估爲包含文字字「空」(類似於傳遞一個空值到PrintStream)的字符串。你的綁定需要把空單元作爲特殊情況:

column.setCellFactory(tc-> { 
    TableCell<Word, Integer> cell = new TableCell<>(); 
    Text text = new Text(); 
    cell.setGraphic(text); 
    text.setTextAlignment(TextAlignment.CENTER); 
    text.setStyle("-fx-fill: -fx-text-background-color;"); 
    text.setFontSmoothingType(FontSmoothingType.LCD); 
    text.wrappingWidthProperty().bind(column.widthProperty().subtract(5)); 
    text.textProperty().bind(Bindings.createStringBinding(() -> { 
     if (cell.isEmpty()) { 
      return null ; 
     } else { 
      return cell.getItem().toString(); 
     } 
    }, cell.emptyProperty(), cell.itemProperty())); 
    return cell; 
}); 

,或者你需要重寫updateItem()

column.setCellFactory(tc-> { 
    TableCell<Word, Integer> cell = new TableCell<>() { 
     private Text text = new Text(); 
     { 
      this.setGraphic(text); 
      text.setTextAlignment(TextAlignment.CENTER); 
      text.setStyle("-fx-fill: -fx-text-background-color;"); 
      text.setFontSmoothingType(FontSmoothingType.LCD); 
      text.wrappingWidthProperty().bind(column.widthProperty().subtract(5)); 
     } 

     @Override 
     protected void updateItem(Integer item, boolean empty) { 
      super.updateItem(item, empty); 
      if (empty) { 
       text.setText(null); 
      } else { 
       text.setText(item.toString()); 
      } 
     } 
    }; 
    return cell; 
}); 
+0

非常感謝,我已經使用了第二種方法,因爲第一種方法在'createStringBinding(()'方面給了我一個錯誤。我能再問一件事:如果一個帶整數項的空單元格評估爲「null」我的空字符串單元格沒有這樣做嗎? – zotmer

+0

修復了綁定版本中的錯誤。我無法真正評論我無法看到的代碼的行爲;是否在單元格的綁定中使用了'asString()' (這很奇怪,因爲它們已經是字符串) –

+0

字符串的代碼幾乎是相同的,只是當綁定時我有'text.textProperty()。bind(cell.itemProperty());' – zotmer