Como organizar um projeto Java (com UML ou não) em MVC com NetBeans?

Comecei a mexer no NetBeans graças a uma edição da Java Magazine que comprei. Eu fiz uma janela para um programinha, só para experimentar, que funciona belezinha. Criei ela dentro de um pacote “Visão” e consigo fazê-la funcionar no meu Main.class que fica na raiz (pacote default). Eu tenho as classes importantes, que lidam com os dados em si, no pacote “Model”, mas eu não sei bem o que fazer com o pacote “Controller” nem como instanciar cada coisa. O NetBeans já coloca os métodos para tratamento de eventos na classe Janela, conforme eu peço, mas isso não deveria ficar em uma classe dentro do pacote “Controller”?

Eu preciso de um esqueminha simples: como deve ficar o meu Main? Ele vai instanciar classes de Model, View e Controller? Vai só chamar o Model que então instancia View e Controller? E o Controller? Fica dentro do View? Ou o contrário? Ou nenhum dos dois?

Eu quero o seguinte: existem dois campos de texto na minha janela. Quando eu clico no botão, o programa pega o primeiro campo de texto, processa de alguma forma e coloca o resultado no segundo campo de texto. Como é a seqüência das instanciações e chamadas de método para isso respeitando o modelo MVC?

Hum… espero que eu tenha conseguido ser suficientemente claro! :roll:

Abraços!

A VIEW chama o controler, que delega a execução pro negócio, que devolve o fluxo pro controler e que repassa (com dados) para a view.

Sacou?

Deixa eu ver se entendi: a View chama o Controller, o controller delega a execução pro model (negócio?), que devolve o fluxo pro controller que repassa com dados para a view.

Onde fica a classe Main?

O tratamento de eventos fica na View ou na Controller? Parece-me lógico que na controller, mas como?

Como uma classe do pacote View chama uma do Controller se os dois são pacotes diferentes?

Tem como criar umas classezinhas bundas só pra eu ver isso em código?

Se a classe Main q vc tá citando é a classe que contém o método public statc void main (String[] args) { //…}, ela fica exatamente no início da sua aplicação, ou seja, vc só usa ela para iniciar a aplicação.

[quote=Fox] O tratamento de eventos fica na View ou na Controller? Parece-me lógico que na controller, mas como?
[/quote]
humm… uma ação, como por exemplo, incluir aluno, deverá ser executada no controle. A view lança um evento que avisa o controle para executar a operação IncluirAluno!

[quote=Fox] Como a View chama o Controller se os dois ficam em pacotes diferentes? [/quote] É só vc importar o pacote, com o comando

import seu.pacote.com.SuaClasse

Abraços!
Thiago

Hum… ok! Estou testando aqui e até agora consegui importar as classes necessárias! Parece que está tudo ok! Qualquer coisa posto mais mensagens!

:wink:

Muito obrigado!

FUNCIONOU!!!

IT LIVES!!!

BWAHAHAHAHAHAHAHAHA!!!

:twisted:

Her… hum hum…

Desculpem, eu emporguei. É que consegui criar um .jar auto-executável com uma GUI feita em NetBeans e que usa o modelo MVC. Acho que estou pegando o jeito!

:wink:

rsrs…

quando consigo algumas proesas também gosto de sair mostrando pra todo mundo… hihi!

Parabéns!

tambem estou com algumas duvidas a respeito disso:

1º - MVC apenas para J2EE ou Web?? porque eu estou fazendo uma aplicaçãozinha client-server J2SE 1.5 swing(firebird), soh pra aprendizado mesmo, pra catalogar minhas revistas(tipow vou cadastrar revista, edicao, e assunto!! pra quando eu tiver alguma duvida eu faço a busca e sei em qual revista fala sobre o assunto)

2º Eu estou fazendo assim(nem sei se é mesmo MVC): uma classe RevistaDTO(soh com os campos tipow: String Nome int ID e com getters e seters, uma classe RevistaDAO que obtem uma connection e faz os inserts, selects e updates tipo public void create(RevistaDTO revista)…; e a classe visual RevistaView que instancia uma RevistaDTO para obter os campos, e uma RevistaDAO para chamar os metodos create() passando como argumento a RevistaDTO, mais ou menos isso!! Esta certo esta logica que estou fazendo???

fred, Isso não quer dizer que seja MVC ou puramente OO.

Se buscar por discussões (enormes) aqui no GUJ, vai ver que muita gente não gosta desse modelo de DTO + DAO, pois acaba virando uma “biblioteca” de funções mais uma estrutura de dados, já que você poderia se aproveitar da OO a juntar dados + ações sobre eles.

Esta seria só sua parta do M, nada a ver com V ou C.

Olá!

Isso q vc citou tá mais pra arquitetura 2 camadas…

veja bém, MVC é Model View e Controller, que graficamente é mais ou menos isso:

view --> controle --> modelo

E o seu código está assim…

view ------------------> DAO
DTO (vírus)

Minhas sugestões são as seguintes:

1 - O que é DTO? Para que ele serve? Onde ele deve realmente ser usado?

2 - O seu DTO com os atritubutos e getters and setters deveriam ser substituidos por objetos de negócio, criando assim o modelo de sua aplicação. Ou seja, vc teria uma classe chamada Revista, e não RevistaDTO.

3 - Do jeito que vc está implementando, sua view cria um dto e passa ele pro DAO. E onde está o controle? O controle deve receber a solicitação da View, e encaminha esta solicitação para alguém, seja método ou classe, que sabe como tratar esta soclicitação.

Abraços!
Thiago

essa é a questao como organizar as classes para fazer um aplicação swing?? esse modelo que eu expliquei eu meio que inventei(ja que nao li nada a respeito) pensei assim ficaria melhor mais distribuido!!! como seria entao a organização para fazer isso, com OO como vc disse??

Você pode usar uma FMK que te ajuda: X-Work.

hum… ta começando a clarear!!! 8 :?
ta entao eu discarto a DTO, e fico com a DAO e uma apenas Revista?? e nesta revista teria um metodo insertRevista() que chamaria a DAO para inserir??? e eu teria uma instancia da Revista na View?? para carregar os dados??

a questao é? como ficaria a view? quem ela instanciaria(ou nao) e como ela passaria os dados dos fields?? para esse controle como vc citou?

[quote=Fox McCloud]Onde fica a classe Main?

O tratamento de eventos fica na View ou na Controller? Parece-me lógico que na controller, mas como?
[/quote]

No meu entendimento de MVC no desktop, o Controller é o gerenciador da View e do Model. O Controller é a sua classe Main (o “boot” da aplicação), mais os manipuladores de eventos que chamam as regras de negócio (Model).

Resumindo, a GUI gera eventos (View) que são tratados pelos manipuladores de evento (Controller), acessando de alguma forma a lógica da aplicação (Model).

Veja http://www.churchillobjects.com/c/14058.html.

fred:

Revista r = new Revista(). r.setDados( .. ); r.save();

ou

Revista r = new Revista("revista 01");
RevistaDAO dao = new RevistaDAO();
dao.save(r);

A abordagem do daniel é muito mais da hora. Mas por enquanto, se vc estiver iniciando, acho bom vc saber que a abordagem do Daniel é a ideal, mas ai vc acopla seu código sql no seu método save da sua classe de negócio, ou entaum o método save de sua classe revista poderia estar chamado o dao, tipo assim

public void save() {
    RevistaDAO dao = new RevistaDAO();
   dao.save(this);
}

Bom… mas pessoalmente, eu ficaria com a primeiro exemplo que te citei. Em breve, de acordo vc for se familiarizando mais com a linguagem, vc vai naturalmente adotar a abordagem que o Daniel citou!

Pq esperar?

[quote=fredferrao]ta entao eu discarto a DTO, e fico com a DAO e uma apenas Revista?? e nesta revista teria um metodo insertRevista() que chamaria a DAO para inserir??? e eu teria uma instancia da Revista na View?? para carregar os dados??

a questao é? como ficaria a view? quem ela instanciaria(ou nao) e como ela passaria os dados dos fields?? para esse controle como vc citou?[/quote]

Para adicionar uma revista, eu faria new Revista, depois mandava salvar com revista.save() {dao.save…} ou dao.save(revista) {JDBC.save etc…}. A Revista no caso faz parte do Model e não da View, pois a view é a GUI da aplicação e Revista é uma classe que faz parte do coração da aplicação, que contém sua lógica de funcionamento (regras de negócio). Ao meu ver a View é instanciada pelo Controller. Quem cataria os dados dos controles visuais e passaria para a lógica de negócios seriam os tratadores de eventos que junto com o “main” da aplicação constituem o Controller.

HUAhauhhaua

Bom, pelo entendimento, acho que vou fazer da seguinte forma: juntar as classe DAO e DTO em uma soh: a classe “Revista” esta ja tem os campos, com os devidos setCampos, e essa ja pega um Connection e faz o save(). ai eu ficaria com a view, que instanciaria a Revista setaria os devidos campos chamaria o save(). como o danielDestro exemplificou? Certo??

Sua classe de negócio pode chamar um DAO internamente… na boa!

pelo menos vc abstrai a camada de dados e deixa independente.