首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ChangeListener中获取属性ChangeListener的引用?

如何在ChangeListener中获取属性ChangeListener的引用?
EN

Stack Overflow用户
提问于 2017-08-24 17:18:30
回答 1查看 982关注 0票数 1

我想要添加到属性侦听器,等待何时将调用此侦听器并删除此侦听器。因此,我编写了以下代码:

代码语言:javascript
复制
    ChangeListener<String> listener = (observable, oldValue, newValue) -> {
        textField.setStyle("-fx-border-color:black");
        textField.textProperty().removeListener(listener); //LINE X
    };
    textField.textProperty().addListener(listener);

但是,在X行,我得到了Variable listener might not have been initialized。如何获得对属性ChangeListener在ChangeListener中的引用来删除它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-24 17:42:32

来自JLS,第15.27.2款

与出现在匿名类声明中的代码不同,名字的含义以及出现在lambda主体中的this和超级关键字,以及引用声明的可访问性,都与周围的上下文相同(除了lambda参数引入新的名称外)。 ..。 实际上,lambda表达式需要讨论自己(或者递归地调用自己或调用其其他方法)是不寻常的,而使用名称来引用封闭类中本来会被隐藏的事物(this,toString())则更常见。如果有必要让lambda表达式引用自身(就像通过它引用),则应该使用方法引用或匿名内部类。

(我的重点。)

因此,简单地说,lambda表达式不可能引用它自己。您需要将其重构为匿名内部类:

代码语言:javascript
复制
ChangeListener<String> listener = new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
        textField.setStyle("-fx-border-color:black");
        textField.textProperty().removeListener(this); 
    }
};
textField.textProperty().addListener(listener);

当然,此时您可能不再需要引用了:

代码语言:javascript
复制
textField.textProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
        textField.setStyle("-fx-border-color:black");
        textField.textProperty().removeListener(this); 
    }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45867545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档