Eu sobrescrevo o que o Viny falou. Não apenas é feito, é errado.
Design é dificil , Bom design é trabalhoso, mas é isso que diferencia um bom desenvolvedor de um montador de codigo.
Escrever codigo é fácil, fazer bom design é dificil.
A ideia é separação de responsabilidade pelo encapsulamento. A melhor forma de desenhar encapsulamento é pensar (eu disse pensar) “E se eu trocar swing por outra coisa?” Se o controlador da aplicação depende do swing , já era.
é muito simples isolar. Vc cria uma interface UserActiveMessanger esta classe é responsável por pergunta coisa ao usuário e mostrar mensagens de fluxo (como exeções ou falhas nas regras de negocio) as interface é simples e não depende do swing, por exemplo
public interface UserActiveMessanger {
public void mostraAviso(String texto); // ok com um texto
public boolean confirma(String texto); // sim ou não
public int decideContinuar(String texto) ; // sim, não, cancelar
}
Depois é só implementar usando swing. O controlador recebe um objeto do tipo UserActiveMessanger e nem lhe interessa como isso aparece para o usuário . O usuario poderia ser um ET usando telepatia, tanto lhe faz.
Isto é chamado Inversão de Controle porque quem controla a acção é o UserActiveMessanger e não o controlador de aplicação. O controlador de aplicação invoca o quê ele quer fazer mas não o como. Esta e uma forma simples de resolver a maior parte das dependencias tecnologias e isolar objetos de outros objetos em outras camadas ou APIs.