2017-09-27 268 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多年。我剛剛走進拉姆達,我沒想到會回來。哈哈。 –