Это слишком долго для комментария ...
Сначала, и это никак не связано с остальной частью этого ответа: есть много разных MVC, и тот, который вы использовали в этом кускекод, который вы разместили здесь, , а не такой же, как тот, который использовался в статье, на которую вы ссылались: http://www.oracle.com/technetwork/articles/javase/mvc-136693.html
В статье правильно указано, что это просто "Обычная реализация MVCMsgstr " (тот, где представление регистрирует слушателя, слушающего изменения модели).Ваша реализация представляет собой другой тип MVC, где контроллер регистрирует слушателя, слушающего изменения модели, а затем обновляет представление.
Не то, чтобы в этом было что-то не так: существует много различные типы MVC (*).
(Еще одно маленькое предостережение ... Ваше мнение знает о вашем контроллере в вашем примере, что немного странно: есть другие способы сделать то, что выбез необходимости «подавать» контроллер на представление, как вы делаете с помощью setControl (...) внутри вашего MVCView .)
Но в любом случае ..Вы в основном почти всегда модифицируете GUI вне EDT (что не следует делать):
public void setIconLabel(final Icon icon) {
myLabel.setIcon(icon);
}
Вы можете проверить это, добавив следующее:
System.out.println("Are we on the EDT? " + SwingUtilities.isEventDispatchThread());
Это потому, что вы в конечном итоге делаете эти обновления из вашего потока SwingWorker (поток SwingWorker запускается вне EDT: это в основном точка работника Swing).
Я бы лучше обновил графический интерфейс из EDTделаю счто-то вроде этого:
public void setIconLabel(final Icon icon) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
myLabel.setIcon(icon);
}
});
}