2015-05-11 1 views
1

Я пытаюсь создать TreeTableView и пытаюсь установить распродажу стоимость завода понесовместимым типа возвращаемого ReadOnlyLongWrapper в лямбда-выражении

@FXML 
    private TreeTableColumn<Good, Long> folderId; 

здесь:

folderId.setCellValueFactory((TreeTableColumn.CellDataFeatures<Good, Long> param) -> 
       new ReadOnlyLongWrapper(param.getValue().getValue().getFolderId())); 

Я получаю это подчеркнет красное с ошибкой описанных в названии. getFolderId в Good классе является следующее:

public Long getFolderId() { 
     return folderId; 
    } 

того же метод отлично работает для строки или булевых значений, но капли исключения, упомянутое в названии и следующий на компиляции:

incompatible types: bad return type in lambda expression 
    javafx.beans.property.ReadOnlyLongWrapper cannot be converted to javafx.beans.value.ObservableValue<java.lang.Long> 

как получить ObservableValue<java.lang.Long> вместо ReadOnlyLongWrapper и почему это исключение появляется только с длинными значениями?

здесь весь метод:

goodsPane.setCenter(goodTreeTableView); 
     List<Good> goodAndFoldersList = goodsService.getGoods(); 
     List<Good> goods = new ArrayList<Good>(); 
     List<Good> roots = new ArrayList<Good>(); 
     for (Good good: goodAndFoldersList){ 
      if (good.isIs_folder()) { 
       roots.add(good); 
      }else { 
       goods.add(good); 
      } 
     } 
     TreeItem<Good> rootItem = new TreeItem<>(); 
     for (Good root: roots){ 
      Long folderId = root.getId(); 
      TreeItem<Good> rootTreeItem = new TreeItem<>(root); 
      for (Good good: goods){ 
       if (good.getFolderId() == folderId){ 
        TreeItem<Good> goodTreeItem = new TreeItem<>(good); 
        rootTreeItem.getChildren().add(goodTreeItem); 
       } 
      } 
      rootItem.getChildren().add(rootTreeItem); 
     } 
     goodTreeTableView.setRoot(rootItem); 
     goodName.setCellValueFactory((TreeTableColumn.CellDataFeatures<Good, String> param) -> 
       new ReadOnlyStringWrapper(param.getValue().getValue().getName())); 
     folderId.setCellValueFactory((TreeTableColumn.CellDataFeatures<Good, Long> param) -> 
       new ReadOnlyLongWrapper(param.getValue().getValue().getFolderId())); 
     is_folder.setCellValueFactory((TreeTableColumn.CellDataFeatures<Good, Boolean> param) -> 
       new ReadOnlyBooleanWrapper(param.getValue().getValue().isIs_folder())); 

ответ

2

ReadOnlyLongWrapper является ObservableValue<Number>.

Таким образом, есть два решения под рукой:

  1. Изменить свой столбец TreeTableColumn<Good, Number> folderId; или
  2. Создать собственную реализацию ObservableValue<Long>.

В большинстве случаев 1 должно быть просто отлично, как вы можете сделать Number.longValue().