diff --git a/fxgl-core/src/main/kotlin/com/almasb/fxgl/core/collection/PropertyMap.kt b/fxgl-core/src/main/kotlin/com/almasb/fxgl/core/collection/PropertyMap.kt index 2cbc3a689..36d319cfb 100644 --- a/fxgl-core/src/main/kotlin/com/almasb/fxgl/core/collection/PropertyMap.kt +++ b/fxgl-core/src/main/kotlin/com/almasb/fxgl/core/collection/PropertyMap.kt @@ -136,6 +136,16 @@ class PropertyMap { mapChangeListeners.forEach { it.onRemoved(propertyName, value) } } + listeners.filter { it.key.propertyName == propertyName }.forEach { (key, listener) -> + // clean up all non-removed JavaFX listeners for given [propertyName] + (get(key.propertyName) as ObservableValue).removeListener(listener as ChangeListener) + } + + // remove all FXGL listeners for given [propertyName] + listeners.keys + .filter { it.propertyName == propertyName } + .forEach { listeners.remove(it) } + properties.remove(propertyName) } diff --git a/fxgl-core/src/test/kotlin/com/almasb/fxgl/core/collection/PropertyMapTest.kt b/fxgl-core/src/test/kotlin/com/almasb/fxgl/core/collection/PropertyMapTest.kt index 5e3ba5e88..f26c8cc15 100644 --- a/fxgl-core/src/test/kotlin/com/almasb/fxgl/core/collection/PropertyMapTest.kt +++ b/fxgl-core/src/test/kotlin/com/almasb/fxgl/core/collection/PropertyMapTest.kt @@ -11,9 +11,7 @@ import javafx.beans.property.SimpleIntegerProperty import javafx.beans.property.StringProperty import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.* -import org.junit.jupiter.api.Assertions.assertEquals -import org.junit.jupiter.api.Assertions.assertFalse -import org.junit.jupiter.api.Assertions.assertTrue +import org.junit.jupiter.api.Assertions.* import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows @@ -240,6 +238,13 @@ class PropertyMapTest { assertThat(count, `is`(2)) } + @Test + fun `Removing a property also removes its listeners`() { + map.setValue("test", 0) + map.remove("test") + assertDoesNotThrow { map.clear() } + } + @Test fun `Copy returns a shallow copy`() { map.setValue("testInt", 3)