sclass AWTOnConceptChangesByClass is AutoCloseable { settable JComponent component; settable Runnable action; settable Concepts concepts; settable Class conceptClass; settable int firstDelay; settable int delay = 500; volatile long changes = -1, changeCounter; javax.swing.Timer timer; AutoCloseable closer; *(Concepts *concepts, Class *conceptClass, JComponent *component, Runnable *action) {} void install { assertNotNull(concepts); assertNotNull(conceptClass); assertNotNull(component); bindToComponent(component, -> closer = onConceptChangeByClass_notOnAllChanged(concepts, conceptClass, -> ++changeCounter), -> { dispose closer; }); timer = installTimer(component, delay, firstDelay, r _trigger); } void _trigger { long c = changeCounter; if (changes != c) { changes = c; action?.run(); } } close { dispose timer; dispose closer; } }