simply use Runnable instead of ChangeListener