2017-09-27 271 views
0

我有一个特殊情况,我想将侦听器添加到可见属性中,然后在该属性不再可见时删除侦听器。我只想让听众发射一次然后将其移除。当侦听器执行时删除侦听器

ChangeListener<Boolean> listener= (obs, ov, nv) -> { 
    if(!nv){ 
     //do my processing 
     node.visibleProperty().removeListener(listener);     } 
     } 
    }; 
node.visibleProperty().addListener(listener); 

但是它告诉我,该变量听众可能没有被初始化。如果我尝试将它设为空,然后创建它,它会抱怨它不是最终的结果

这可能吗?

回答

1

您可以让listener实例变量,而不是一个局部变量,或者您也可以使用匿名内部类(在其中您可以使用关键字this指自己):

ChangeListener<Boolean> listener = new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> obs, Boolean ov, Boolean nv) { 
     if (! nv) { 
      node.visibleProperty().removeListener(this); 
     } 
    } 
}; 
node.visibleProperty().addListener(listener); 
+0

谢谢 - 我甚至没有想过要使用内部类而不是lambda。 –

+0

@purringpigeon啊,今天的青春。当我还是小伙子时,我们甚至没有拉姆达表达式等等。 –

+0

青年?我已经做了20多年。我刚刚走进拉姆达,我没想到会回来。哈哈。 –