simplify, refactor...
use ChangeListener