java - lambda 表达式中的返回类型 ReadOnlyLongWrapper 不兼容

标签 java lambda javafx treetableview

我正在尝试创建一个 TreeTableView并尝试将销售值(value)工厂设置为

    @FXML
    private TreeTableColumn<Good, Long> folderId;

这里:

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

我得到了带有红色下划线的标题中描述的错误。 getFolderIdGood类如下:

public Long getFolderId() {
        return folderId;
    }

相同的方法适用于字符串或 boolean 值,但会在编译时丢弃标题中提到的异常和以下内容:

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为什么这个异常只出现在 Long 值中?

这是整个方法:

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

最佳答案

ReadOnlyLongWrapper ObservableValue<Number> .

因此有两种解决方案:

  1. 将您的列更改为 TreeTableColumn<Good, Number> folderId;
  2. 创建您自己的 ObservableValue<Long> 的实现.

在大多数情况下,1 应该就可以了,就像你可以做的 Number.longValue() .

关于java - lambda 表达式中的返回类型 ReadOnlyLongWrapper 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30172613/

相关文章:

java - 如何使组件在透明 JFrame 中可见

java - GmapsFX。从 map 中删除调试面板

java - 如何在 JavaFX Scene Builder 文本字段中获取用户输入?

java - 通过 JavaFX 过滤 JDK 错误系统

java - 在 Tomcat7 上安装应用程序

java - Camel POST RestService 接受 JSONArray : annotations and parsing errors

java - 如何使用 yourkit 调查类加载器泄漏

C# 使用 lambda 获取列值并读取代码后面的值

Python 避免 lambda for key 需要两个可调用对象(函数组合)

lambda - 使用 Lambda 函数使用供应商提供的所有对象