Mvc Swing

Boa tarde a todos,

eu sei que este assunto já foi bastante discutido aqui no GUJ, mas vamos lá!

tenho algumas duvidas de como implementar MVC usando swing, como por exemplo …

1 - Na web normalmente vc tem um evento (clicar de um botao por exemplo) que envia os dados da view para serem trabalhados pelo controller. Os dados vao todos de uma vez na forma de uma requisição. Eu poderia até chamar esta operação de binding entre essas duas camadas, a minha pergunta é, qual a melhor forma de fazer isso com swing!? como ligar essas duas camadas?

Por exemplo, qdo efetuar um click em um botao salvar (Swing), trafego todos os dados de uma vez para o controller para poder manipula-los, OU, vou fazendo isso a medida que o usuario vai digitando e perdendo o foco dos componentes!?

Gostaria de lembrar que no projeto que eu estou nao posso utilizar nenhum tipo de framework para binding, e qlqer tipo de solução mirabolante esta fora de cogitação. Feijão com arroz galera :D.

2 - Ideias de como manter a sincronia view -> controller e controller -> view … pensei em algo como no exemplo que eu anexei no post. Esse exemplo eu extrai de um tutorial da sun, e fiz algumas adaptações.

3 - sem sermões sobre a utilização de soluções caseiras :D. Infelizmente o cliente possui muitas restricoes quanto ao ambiente e ferramentas para o desenvolvimento e não a nada a fazer quanto a isso. Se eu pudesse utilizar frameworks como o Genesis (ou qlqer outro bom framework para swing) eu utilizaria!

4 - Sim, o exemplo esta meio pedreiro, mas tentem captar a sua essencia rsss e discutir em torno dele :D!

Bom galera, é isso,

agradeço desde já qualquer colaboração!

abraços!

Olá rafa.

Infelizmente não tive muito tempo para analisar seu código, mas acho que está no caminho correto.
Sobre a utilização do MVC com swing, eu a costumo fazer mais ou menos da seguinte maneira:

Uma classe da view captura um evento do usário, clicar no botão salvar por exemplo.
Esta classe aciona o método associado na camada de controle passando as informações necessárias. No exemplo do botão salvar, seriam enviadas as informações a serem salvas (em uma classe ou através dos parâmetros).
A camada de controle efetua então as alterações necessárias na camada de modelo e aciona listeners, se necessário, retornando o resultado da operação à camada de visão.

Assim, a sincronia pode ser mantida com certa facilidade, pois a camada de controle retorna à camada de visão o resultado da operação (que pode ser apenas uma confirmação de que a informação foi salva, por exemplo) e as demais classes podem ser avisadas conforme a necessidade através dos listeners - que podem ser fundamentais em algumas situações.

Para isso, a camada de visão deve possuir alguma ligação com a camada de controle, o que eu geralmente implementava através de um relacionamento entre elas e os listeners devem ser devidamente adicionados aos objetos.

[quote=davidtiagoconceicao]Olá rafa.

Infelizmente não tive muito tempo para analisar seu código, mas acho que está no caminho correto.
Sobre a utilização do MVC com swing, eu a costumo fazer mais ou menos da seguinte maneira:

Uma classe da view captura um evento do usário, clicar no botão salvar por exemplo.
Esta classe aciona o método associado na camada de controle passando as informações necessárias. No exemplo do botão salvar, seriam enviadas as informações a serem salvas (em uma classe ou através dos parâmetros).
A camada de controle efetua então as alterações necessárias na camada de modelo e aciona listeners, se necessário, retornando o resultado da operação à camada de visão.

Assim, a sincronia pode ser mantida com certa facilidade, pois a camada de controle retorna à camada de visão o resultado da operação (que pode ser apenas uma confirmação de que a informação foi salva, por exemplo) e as demais classes podem ser avisadas conforme a necessidade através dos listeners - que podem ser fundamentais em algumas situações.

Para isso, a camada de visão deve possuir alguma ligação com a camada de controle, o que eu geralmente implementava através de um relacionamento entre elas e os listeners devem ser devidamente adicionados aos objetos.[/quote]

se voce tiver algum exemplo que pudesse me passar seria bastante interessante!

Grato pela atenção,

Rafael

Tenho disponível aqui um exemplo simples em que eu uso o MVC para resolver parte da especificação de um trabalho de faculdade de uns semestres atrás.

Tem uns pequenos probleminhas, mas espero que seja útil.

Valeu!

Edit: esqueci de comentar, as classes não estão bem separadinhas, se tiver alguma dúvida sobre quem faz o que é só falar.

Acho que você vai gostar desse artigo:
http://java.sun.com/products/jfc/tsc/articles/architecture/

Particularmente, a menos que sua aplicação Swing comunique-se com servidores remotos, você não precisa usar um modelo tão complexo na camada de controle.

O grosso da divisão ficará mesmo entre o model (que descreve os dados) e a view (que exibe os dados). E a camada de controle?

Use o padrão Observer para desacoplar as mensagens do modelo até a view. E use o padrão strategy para que a view não conheça exatamente quem é a implementação do seu modelo.

Isso fica realmente muito simples, pois, como a aplicação Swing é geralmente quase toda local, podemos usar os próprios mecanismos da linguagem para garantir isolamento das coisas.

A menos que você esteja implementando algo muito exotérico, não fuja a regra do KISS.

[quote]Particularmente, a menos que sua aplicação Swing comunique-se com servidores remotos, você não precisa usar um modelo tão complexo na camada de controle.
[/quote]

não, realmente não é o caso!

[quote]O grosso da divisão ficará mesmo entre o model (que descreve os dados) e a view (que exibe os dados). E a camada de controle?

Use o padrão Observer para desacoplar as mensagens do modelo até a view. E use o padrão strategy para que a view não conheça exatamente quem é a implementação do seu modelo. [/quote]

Pretendia utilizar o Observer para fazer esse “binding”, mas não compreendi como usar o Strategy para este fim. Nesta situação o observer estaria atuando como o controller ou estou viajando? Voltando ao Strategy, este pradrão tem a ver em como oferecer uma interface unica para uma operação, e diversas implementações para a mesma, de forma que eu possa alterar o comportamento de forma transparente (Certo!?). O que vc imaginou??

Quando vc diz os mecanismos da propria linguagem, se refere a utilização das interfaces dos modelos oferecidos pelo proprio swing para cada componente? poderia sobrescrever um TableModel e transformar ele em um MyBusinnesTableModel? :shock:

A aplicação possui regras de negocio nao muito simples e telas piores ainda :smiley:
Cara, agradeço a sua ajuda, e se voce tiver como ilustrar de alguma forma o que voce disse eu agradeceria!! :smiley:

Abraço,

Rafael

É como faz o JTable. Ele se baseia apenas num “TableModel”, que é o AbstractStrategy de um model específico qualquer, como o seu ClientesTableModel.

Claro, numa inteface gráfica mais específica (como a tela do cadastro dos clientes), nem sempre vale a pena manter as coisas tão desacopladas assim. O strategy geralmente é mais recomendado para criar modelos genéricos para componentes que vão ser reusados. Não consigo ver muita utilidade em criar interfaces e, abstract factories e outras parafernálhas para deixar uma tela de “Cadastro de produtos” genérica e suportando plugins (a menos lógico, que isso seja um requisito do sistema).

Não só do Swing. Digo que você não precisa de todo um framework para camada de controle, porque os próprios mecanismos de interface e polimorfismo da linguagem já garantem para você que a aplicação fique suficientemente desacoplada. A figura de alguém que precisa conhecer “onde estão os containeres” para então decidir “para quem entregar as mensagens” (como é o caso de um Struts, ou outros frameworks de controle) pode ser substituida por uma simples chamada de método, usado o devido polimorfismo.

O que existe no Swing serve de exemplo do uso da técnica, pois o Swing (como mostra o artigo que eu postei ali em cima) já implementa o MVC usando para isso os mecanismos da linguagem Java.

Aqui cabe uma analogia: Para falar com o colega da mesa do seu lado, você simplesmente se dirige a ele e troca mensagens. O meio é simples, porque a situação é simples. Agora, se vc quiser falar com aquele seu colega no japão, vai ter que recorrer a um meio mais complexo, a companhia telefônica. Esse meio é sua camada de controle, evite sobrecarrega-la se o problema não está lá.

Note que, como tudo em projetos, tudo vai depender do sistema sendo desenvolvido e do grau de flexibilidade que você queira no futuro. Essa sugestão que estou dando é simples, mas cobre muito bem as aplicações Swing que você descreveu.

Opa…
O que eu vou falar aqui é muito tosco e talvez vocês dêm dor de barriga de tanto rir de mim, mas lá vai:
Em swing, crio uma tela (JFrame ou JDialog), adiciono os componentes visuais (jbuttons, jtables, jlabels, etc) e vou implementando os eventos desses componentes, tipo, se quero gravar algo no banco implemento o evento actionPerformed de um jbutton para gravar diretamente no banco de dados o conteúdo dos jtextfields da tela… Não separo nada, a não ser a classe de conexão… Sei que isso é horrível, mas como nunca tive aulas disso e não tive tempo de estudar bons livros eu metí o braço e desencanei assim um projeto inteiro no final do ano passado… Fui muito criticado por não ter nada padronizado, pela programação “tipo Delphi”, rsrs… Mas eu realmente não entendo como aplicar MVC em Swing… Agora estou com o mesmo problema: meu projeto de conclusão de curso tem um módulo desktop e um web, no módulo web uso o Model 2, baseado em MVC, com JSF, mas minha aplicação desktop está toda despadronizada…
Alguém pode me dizer como separar o Model, a View e o Controller numa aplicação swing?
Valeu!!!