Поскольку этот вопрос меня зацепил, я хотел знать, почему он запускается три раза.
Как показывает трассировка стека, изменения запускаются событием мыши.
Сначала мышь нажимают.Он вызывает DefaultButtonModel.isArmed (true) и DefaultButtonModel.isPressed (true).Каждый метод вызывает событие изменения.Здесь мы имеем первую и вторую итерацию.Во-вторых, мышь отпущена.Он вызывает DefaultButtonModel.isPressed (false), снова вызывая событие изменения.Третья итерация.
К вашему сведению, DefaultButtonModel - это реализация интерфейса ButtonModel.