【问题标题】:How do I write a new ListChangeListener<Item>() with lambda?如何使用 lambda 编写新的 ListChangeListener<Item>()?
【发布时间】:2014-06-13 16:06:10
【问题描述】:

如何在 java8 中使用 lambda 编写新的 ListChangeListener()?

listItems.addListener(new ListChangeListener<Item>() {
    @Override
    public void onChanged(
        javafx.collections.ListChangeListener.Change<? extends Item> c) {
        // TODO Auto-generated method stub
    }
});

这是我尝试过的:

listItems.addListener(c->{});

但日食状态:

方法 addListener(ListChangeListener) 对于 输入 ObservableList。

列表声明为:

ObservableList<Item> listItems = FXCollections.observableArrayList();

【问题讨论】:

    标签: java lambda listener java-8 changelistener


    【解决方案1】:

    此代码无需指定类型即可工作。

    listView.focusedProperty ().addListener ( (arg, oldVal, newVal) -> System.out
            .printf ("ListView %s focus%n", (newVal ? "in" : "out of")));
    

    【讨论】:

    • 您的解决方案适用于 ListViews,但问题是关于 ObservableLists,它没有focusedProperty。
    【解决方案2】:

    由于ObservableListObservable接口继承addListener(InvalidationListener),编译器无法确定调用哪个版本。通过强制转换指定 lambda 的类型应该可以解决此问题。

    listItems.addListener((ListChangeListener)(c -> {/* ... */}));
    

    也可以显式指定c的类型:

    listItems.addListener((ListChangeListener.Change<? extends Item> c) -> {/* ... */});
    

    【讨论】:

    • searchResultListItems.addListener((ListChangeListener.Change&lt;? extends Contact&gt; c) -&gt;{}); 为提示做了诀窍
    • 无法使用 ChangeListener 执行上述选项。使用 PropertyListeners...“Lambda 表达式的签名与更改的功能接口方法的签名不匹配(ObservableValue, Object, Object)”。 - 尝试时:property.addListener((ChangeListener) e -> ({/* ... */}));
    猜你喜欢
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 2013-04-30
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多