A) Я бы порекомендовал вам временно удалить слушателя, когда вы выполняете выбор программно.
B) Если ваши программные изменения не являются следствием другого события GUI, вы можете решить его следующим образом:-пробный / подверженный ошибкам / "хакерский" способ: установите флажок EventQueue.isEventDispatchThread()
, чтобы узнать, был ли щелчок инициирован потоком GUI (пользователь).
C) (Ой, я просто перечиталвопрос и увидел, что вы уже обнаружили метод, описанный ниже. По сути, я бы сказал, что это (или метод, описанный выше) является вашей лучшей альтернативой.)
Другой вариант - иметь логическое значениефлаг, называемый чем-то вроде nonUserSelection
, который вы устанавливаете в true перед тем, как программно выбрать значение и впоследствии сбросить в false.В слушатель действия вы просто добавляете
if (nonUserSelection)
return;