gpt4 book ai didi

JavaFX 使用 lambda 表达式删除 InvalidatorListener

转载 作者:行者123 更新时间:2023-11-30 02:52:42 28 4
gpt4 key购买 nike

我正在使用此代码:

    renameWindow.showingProperty().addListener(new InvalidationListener() {
@Override
public void invalidated(Observable observable) {

//Remove the Invalidator Listener
renameWindow.showingProperty().removeListener(this);

}
});

我想以 lambda 方式做,我使用:

renameWindow.showingProperty().addListener(listener->{
renameWindow.showingProperty().removeListener(this);
});

我收到错误,因为监听器可能是 Observable 接口(interface)或者什么?。我想使用 lambda 表达式来执行此操作。如何做到这一点?如何使用 lambda 删除 InvalidationListener。

最佳答案

this 引用包含代码的类的实例,而不是 lambda 表达式本身。

jls-15.27.2: Lambda Body

Unlike code appearing in anonymous class declarations, the meaning of names and the this and super keywords appearing in a lambda body, along with the accessibility of referenced declarations, are the same as in the surrounding context (except that lambda parameters introduce new names).

因此,您尝试使用未实现 InvalidationListenerChangeListener 的对象作为参数来调用 removeListener,这意味着没有removeListener 方法适用。

获取 lambda 表达式引用的唯一方法是使用某个表达式从执行 lambda 主体时评估的 lambda 主体访问对它的引用。

这可以做到,例如通过将其分配给一个字段。

示例

private InvalidationListener listener = observable -> renameWindow.showingProperty().removeListener(this.listener);

关于JavaFX 使用 lambda 表达式删除 InvalidatorListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38172135/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com