Swing: программная модификация интерфейса без вызова обратных вызовов - PullRequest
1 голос
/ 30 ноября 2010

Если считается само собой разумеющимся, что вам необходимо программно изменить элемент пользовательского интерфейса, такой как, скажем, выбранный элемент JComboBox без запуска какого-либо события модификации / уведомления, то как сделать это относительно чисто?

Конечно, я могу отсоединить всех слушателей, а затем снова подключить их, как только я изменю то, что хочу изменить, но, как правило, как это сделать? (еще раз, учитывая, что предоставлено, что некоторый элемент должен быть изменен, и что считается предоставленным, что это изменение не должно вызывать никаких обратных вызовов).

PS: я сделал это, написав методы, которые фактически отсоединяют всех слушателей, выполняют модификацию, затем повторно подключают всех слушателей, и это работает, но мне это кажется немного дерьмовым.

Ответы [ 2 ]

2 голосов
/ 30 ноября 2010

Обычно проблема не во всех слушателях, а в одном - в нашем. Типичная схема игнорирования таких событий следующая:

private boolean ignoreEvents;

public void initialize(...) {
   ignoreEvents = true;
   try {
      // set the combobox value
   }
   finally {
      ignoreEvents = false;
   }
}

private void processMyXyEvent(...) {
   if (ignoreEvents) {
      return;
   }

   // listener code
}
1 голос
/ 30 ноября 2010

Я думаю, что методы, которые вы реализуете, наиболее близки к чистому способу выполнения того, что вы ищете.И хотя я понимаю, что требование считается само собой разумеющимся, возможно, стоит отметить, что, избегая всех установленных слушателей (в частности, ВСЕХ из них, а не только тех, кого вы настраивали самостоятельно), вы можете в конечном итоге управлять состоянием своегоприложение к чему-то, что внутренне противоречиво.

Полагаю, я хочу сказать, что вы должны действовать осторожно:)

...