侦听器执行时删除侦听器

pur*_*eon 1 javafx-8

我有一个特殊的情况,我想向可见属性添加一个侦听器,然后在该属性不再可见时将其删除。我只希望听众触发一次然后将其删除。

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

但是,它告诉我变量侦听器可能尚未初始化。如果我尝试将其设置为null,然后创建它,它会抱怨说它实际上不是最终的

这可能吗?

Jam*_*s_D 5

您可以使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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢 - 我什至没有想过使用内部类来代替 lambda。 (2认同)
  • @purringpigeon 啊,今天的年轻人。当我还是个小伙子的时候,我们甚至没有 lambda 表达式等等。 (2认同)
  • 青年?我已经这样做了 20 多年。我只是在 lambda 中走得太远,我没有想到要回来。哈哈。 (2认同)