Para o gesture a visão tratará sozinha.Se usa swing, o AWT fará esse papel.
se usa web, o browser/javascript fará esse papel.
O MVCé a soma de um conjunto de padrões que é maior que as partes.
Para o gesture a visão tratará sozinha.Se usa swing, o AWT fará esse papel.
se usa web, o browser/javascript fará esse papel.
O MVCé a soma de um conjunto de padrões que é maior que as partes.
Boa tarde Sergio, obrigado por estar colaborando com o tópico!
Entendi quando disse que o gesture quem trata é a própria visão. Legal! É Swing sim.
Porém o tratamento das gestures que ocorrem na visão deverão chamar métodos do controle quando necessário alterar o modelo, estou certo?
A visão vai se associar diretamente com o controle? Ou seja, vai ter um atributo de controle?
OBRIGADO a todos que estão colaborando! Agradeço muito e fico no aguardo pela resposta!
Não. A visão envia gestos do tipo “clique no botão X”, “duplo clique no label Z”, “mouse movendo sobre imagem H”
Isto não significa nada para o negocio/dominio. A visão envia estes gestos pelo padrão Observer para o controlador. (note que no swing o componente swing é o controlador MCV do swing. Por exemplo JButton é um controlador.)
O Controlador pode responder se se trata de um evento de visão (aumentar painel num JSplitPane) , mas se for um evento de negocio ele terá que responder diferente. NO swing, os eventos da visão são interceptado para reconhecer eventos de nogocio (ou seja,vc coloca um action listener no JButton para poder dar save.Save é de negocio.)
Aqui temos duas opções , ou invocamos um objeto que sabe resolver o evento (no caso do save chamar um objeto.save(instancia))
ou delegamos a um outro objeto. O primeiro caso, dentro do listener são lidas as informações necessárias e ativadas as acções no banckend. Isso é um pesadelo.
Com um outro objeto vc lança um evento / chama um método de um outro objecto.Ele conhece o negocio.
Então o controler do MVC de apresentação chama um outro objecto.
Este cara conhece como ler um formulário, por exemplo. então quando ele recebe o comando de salvar ele sabe onde ler as informações da tela , colocar num bean e invocar um objeto para fazer o real serviço de salvar.
Este objeto pode ser o model ou um outro objeto “fora” do MVC.
Quem é o model ? O model é por exemplo um TableModel ou um Action ou algum objeto associado ao Controlador do swing.
Este objeto é comandado pelo controlador (de dentro do listener). Por exemplo, um botão pode ser desabilitado com action.setEnable(false). Isto irá ativar um evento na view para que ela se re-renderize e por consequencia mostre o botão desativado vc não deve fazer butto.setEnable(false).
So que controlar codigo dento do model ou do listener vira uma sopa. a solução é usar um presenter
Um Presenter é um objeto que responde a eventos de negocio que interessam. Assim o listener irá invocar presenter,save()
e o presenter ser vira. Ele tem acesso aos modelos da tela para ler informações de formulário ,etc… e depois invocar o save em algum outro objeto . Ele também atualiza algum dos modelos do swing para apresentar estado visual. (por exemplo é comum apresentar um JProgress enquanto a ação está sendo feita.
Utilizar um Presenter é mais comodo. Repare que do pronto de vista do seu design todo o swing é a sua view embora ele ,lá dentro tenha três partes) e o Presenter atua como controlador e modelo. Este padrão é chamado MVP
Repare que é este o padrão real para coisas como JSF, Spring MVC e qualquer framework “MVC” por ai.
Vc sempre é encarregado de modificar um componente , mas ele não é a view , nem o controlador,nem o modelo.
(a view é o HTML/browser , o controlador é o proprio framework, e modelo são os beans onde estão os dados)
Olá pessoal, eu novamente!
Até entendi a teoria que o Sergio citou no post anterior. Estudei sobre MVP mas acabo caindo nas mesmas dúvidas que tinha no MVC! Chato né?
Até onde tenho visto, o presenter chama os métodos do modelo explicitamente (objetoModelo.metodo()), ou seja, presenter conhece o modelo.
Obrigado pessoal que vem colaborando com este longo tópico…
Reparem que venho postando com menos freqüência para poder estudar a fundo tudo o que vocês se esforçam tentando ajudar!
Espero que não desistam, já se tornou um sonho para mim aprender corretamente uma arquitetura (pelo menos uma) e implementa-la.
Agradeço demais a todos, sem exceções, pelos esforços! Fico no aguardo pelas respostas.
Nada mesmo? Nem uma opinião? :shock:
Estou conseguindo expressar corretamente a pergunta ou ficou ruim de entender?
Qualquer coisa pergunta que eu tento expor melhor ainda o problema pessoal!
Agradeço antecipadamente a todos que estão de alguma forma ajudando ou até mesmo desprendendo do seu tempo lendo para tentar ajudar. Muito obrigado!
Fico no aguardo pela resposta!
Nao precisa , floodar , por favor Aguarde !!!
[quote=pedromuyala]Estou conseguindo expressar corretamente a pergunta ou ficou ruim de entender?
Qualquer coisa pergunta que eu tento expor melhor ainda o problema pessoal!
Agradeço antecipadamente a todos que estão de alguma forma ajudando ou até mesmo desprendendo do seu tempo lendo para tentar ajudar. Muito obrigado!
Fico no aguardo pela resposta! [/quote]
Até entendi a pergunta, mas a resposta que tenho é “Não sei”. Pelo menos ainda não trabalhei com este modelo para saber.
Estas tuas perguntas seriam melhor respondidas no fórum de Arquitetura de Sistemas.
Olá edmarr, boa tarde!
Obrigado por participar conosco no tópico!
Rapaz, desculpa mas não entendi o que você falou…
Procurei por flood mas nada encontrei…
Isso tem a ver com eventos?
Valew, fico no aguardo pela resposta. Obrigadão por estar colaborando
[quote=pedromuyala]Estou conseguindo expressar corretamente a pergunta ou ficou ruim de entender?
[/quote]
Ficou ruim de entender. Em java o modelo de eventos é feito chamando métodos…
vc tem que pensar que
eventos = broadcast : difusão
chamada directa = acoplamento
Se A chama B directamente A depende de B.
Se A lança eventos e B se registra como ouvinte, B depende de A (na realidade do listener de A).
No modelo de evento vc tem uma relação 1-produtor para N-consumidores.
A view chama 1 controlador ou N ? Chama 1. então, ela chama directamente e não pelo modelo de eventos.
Só que, detalhe, a chamada é feita em resposta a um evento (por exemplo,clique do mouse). então, tecnicamente é um evento, embora esse evento vá apenas para um objeto.
Por exemplo, entre o model e o view a relação é inversa. Um model pode alimentar vários views.
portanto alterações no model se propagam via eventos.
Olá Bruno, tudo bem? Obrigado por continuar atento aí mesmo depois de bastante tempo!
[quote=Bruno Laturner]
Até entendi a pergunta, mas a resposta que tenho é “Não sei”. Pelo menos ainda não trabalhei com este modelo para saber.
Estas tuas perguntas seriam melhor respondidas no fórum de Arquitetura de Sistemas.[/quote]
Antes de mais nada quero agradecer muito toda ajuda que escreveu neste tópico. Sua participação foi extremamente importante para deixar bem exclarecida as dúvidas que apareceram.
E mais uma vez mostra-se uma pessoa sincera, ética e profissional. Assim como eu e muitas outras pessoas não sabemos a resposta para a pergunta. É essa sinceridade que engrandece o ser humano. Por que digo isso? Porque você vem acompanhando e ajudando sempre que consegue e chegou um momento que infelizmente não sabemos a resposta mas mesmo assim não deixou de dar uma SATISFAÇÃO mostrando aos demais usuários do GUJ que se alguém souber a resposta, por favor, postem sem receio de atrapalhar ou intrometer-se com o andamento do tópico. Isso é ético e profissional. Meus parabéns mais uma vez como disse anteriormente muitíssimo obrigado por tudo que fez pelo tópico. E espero ainda juntos conhecer a resposta em breve aqui mesmo.
Sobre o fórum de arquitetura já havia percebido isso hà um tempo atrás mas para evitar duplicar o tópico mantive o assunto aqui mesmo. Na verdade esse tópico começou com o título “Simples pergunta de MVC” mas olha como ficou o simples kkkk… Mas mesmo assim agradeço pelo toque!
Um abração Brunão, felicidades rapaz!
Olá Sergio, muito obrigado por continuar atento ao tópico!
Você entendeu sim minha pergunta e respondeu muito bem explicado, uma aula mesmo.
Porém é bem aí que está a minha dúvida principal. Vou tentar explicar o mais detalhado possível para ficar bem transparente:
Quando começar a desenvolver as view’s vou ter várias chamadas aos métodos do controlador (que é um atributo da visão instanciado incialmente). Exemplo disso é o JButton.addActionListener(…), JTextField.addActionListener(…), veja:
botao1.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
controlador.tipoEscolhido(botao1.getText());
}
});
//...
botao2.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
controlador.tipoEscolhido(botao2.getText());
}
});
//...
textfield1.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent e) {
controlador.tipoEscolhido(textfield1.getText());
}
});
Por isso quando observo no desenho do MVC com a linha tracejada (indicando um evento) nomeada “User Gestures” no sentido View—>Controller eu fico sem entende-la!
Se a resposta é o quote acima, me desculpa Sergio pela minha ignorância, mas tem como mostrar isso melhor? :oops: É que não consigo visualizar, ou seja, quando olho para essa seta vejo ela continua (chamada de métodos) e não tracejada (Eventos). Outra coisa que não consigo entender é o controlador chamar métodos na visão (linha continua “Seleciona a View”). 100% acoplamento! :?
Agora um problema pior ainda é:
Suponhamos que o método tipoEscolhido do controlador venha a ser retirado/alterado. Vou ter que alterá-lo em todas as visões (isso se eu não esquecer de nenhuma).
Se não me engano no seu penúltimo post você citou isso (ou pelo menos eu entendi isso) como acabar se tornando um pesadelo. Até foi recomendado o uso do MVP.
Assim como o controlador é acoplado ao modelo, a visão também acaba acoplada ao controlador. A diferença é que o controlador acoplado ao modelo é muito mais fácil de ser corrigido quando necessário realizar mudanças do que a visão acoplada ao controlador, visto que o número de visões é muito maior.
Existe uma solução para isso ou uma outra forma que evite isso?
[size=16][color=red]Mais uma vez quero dizer a todos [/color]obrigado [color=red]por todo o tempo dedicado em ajudar.[/color][/size] :thumbup:
[color=orange]Muito mais do que palavras só mesmo a realidade presente aqui neste tópico de todas as pessoas que vem colaborando.[/color]
Fico no aguaro de respostas, é um prazer e uma honra estar com vocês.
O problema é o seguinte: vc está tentando entender MVC usando Swing. Só que para o swing o view é o Look and Feel. Você raramente irá criar um look and feel. JComponent é a raiz do swing. Este objeto é um controlador,não é a view. Este equivoco é comum. Quando vc aperta um botão e é lançado um actionEvent o pedaço do diagrama view-controller já foi executado. Vc não mexe com isso. Vc nem tem controle disso. (cof cof, ter até tem, mas isso é Swing super avançado, então vamos esquecer aqui).
Bom então o controlador já recebeu o evento vindo da view. Agora ele está lançando eventos para o modelo. A classe Action é um modelo tal como TableModel. Isto não é obvio pelo nome pois parece que Action seria um Comand object, mas não é.
Repare que é o Modelo, sempre o Modelo, que contém a regra especifica para a aplicação. Apertar botões é muito genérico. É a aplicação que tem que decidir o que fazer. então, é na action que a gente coloca o codigo relativo à aplicação em si. Mas pq um controlador uitilizar o mecanismo de eventos ? um botão pode realizar mais do que uma tarefa ? Pode. embora seja meio complicado e impráticável. A razão real é o desacoplamento que permite que um listener possa responder a eventos de mais de um controlador. Isto sim é prático. O exemplo classico é o “sair” A opção “sair” pode ser ativada de duas formas : escolhendo opção Sair no menu ou escolher o botão sair da toolbar. As duas lançam actionEvent, que podem ser pegas pelo mesmo listener (basta registrar o mesmo listener nos dois objetos) .
A action parece não ter atributos que possam “mudar o estado” como descreve a figura , mas tem. ela tem o estado enabled. se vc mudar isto, todos os botões que usam aquela action serão habilitados/desabilitados. No nosso caso o menu e o botão da toolbar serão habilitados/desabilitados ao mesmo tempo e apenas pelo fato que têm o mesmo modelo. Simples assim.
Modelos mais complexos têm outros tipos de dados. Por exemplo TableModel é bem completo , assim como TreeModel.
Qualquer mecanismo MVC já tem as coisas orquestradas. Vc só precisa extender cada uma das partes. Ou o model ou o controler ou a view. No Swing o component é o controler e ele tem uma view livre que é definida pelo look and feel. Mas vc pode compor componentes para compor telas diferentes. Como a view é componentizada, vc consegue um mecanismo de compomentes visuais.
Mas isso é algo que o swing oferece que não tem relação com MVC - isso é o padrão Composite - mas que graças ao mecanismo desacoplado do MVC funciona às mil maravilhas.
Olá pessoal sou eu novamente!
Vou acabar louco com tentando entender a arquitetura do MVC. Pior é que parece ser uma coisa tão simples e natural…
Não consigo entender como a visão se atualiza através do modelo sem conhecer o modelo…
Digo assim: o evento notifica a visão que houve uma alteração… mas para ela reenderizar o modelo ela precisa ter uma instancia do modelo ativa nela ou os dados são enviados dentro do evento?
Agradeço antecipadamente a paciência, me desculpem a perturbação e a insistênca eu sei que já está se tornando uma coisa chata mas por favor peço que não desistam.
Minha intensão mesmo é aprender! Um abração a todos companheiros. Muito obrigado.
[quote=pedromuyala]Olá pessoal sou eu novamente!
Vou acabar louco com tentando entender a arquitetura do MVC. Pior é que parece ser uma coisa tão simples e natural…
Não consigo entender como a visão se atualiza através do modelo sem conhecer o modelo…
Digo assim: o evento notifica a visão que houve uma alteração… mas para ela reenderizar o modelo ela precisa ter uma instancia do modelo ativa nela ou os dados são enviados dentro do evento?
Agradeço antecipadamente a paciência, me desculpem a perturbação e a insistênca eu sei que já está se tornando uma coisa chata mas por favor peço que não desistam.
Minha intensão mesmo é aprender! Um abração a todos companheiros. Muito obrigado.[/quote]
Vou tentar explicar melhor nesse passo-a-passo:
Nesse momento as visões que recebem o evento “carroevent” devem se reenderizar, mas aí vem o X da questão: A visão se atualizará com os valores que estão no evento “carroevent” usando os métodos get() [Ex: carroevent.getCor(), carroevent.getRoda(),…] ou vai usar o objeto carro agregada a ela e chamar os métodos get() de carro [Ex: carro.getCor(), carro.getRoda(),…] para tal? E pergunto ainda se essa segunda opção realmente existe, ou seja, um obejto do modelo deve ser agregado a visão para atualização ou isso não existe?
Obrigado pessoal já estou me sentindo completamente envergonhado :oops: com a situação são mais de 140 postagens com ajuda de muitas pessoas que tenho a certeza de estarem doando o possível e o impossível tentando ajudar muitas vezes desprendendo do seu tempo limitado para isso. São pessoas que valem muito mais que elogios… realmente sem palavras.
Muito obrigado, fico no aguardo das respostas e FELIZ DIA DAS CRIANÇAS!
[size=10][color=red]" Se você é jovem ainda, jovem ainda, jovem ainda
Amanhã velho será, velho será, velho será
Ao menos se o coração, se o coração sustente
A juventude que nunca morrerá "[/color] (Chaves)[/size]
Nada mesmo pessoal? :shock: :idea:
Esse silêncio é assustador!! :? :shock:
Pessoal estou perguntando um coisa que não existe?
Ou a pergunta está mal formulada?
Olhem só:
Nesse momento as visões que recebem o evento “carroevent” devem se reenderizar, mas aí vem o X da questão: A visão se atualizará com os valores que estão no evento “carroevent” usando os métodos get() [Ex: carroevent.getCor(), carroevent.getRoda(),…] ou vai usar o objeto carro agregada a ela e chamar os métodos get() de carro [Ex: carro.getCor(), carro.getRoda(),…] para tal? E pergunto ainda se essa segunda opção realmente existe, ou seja, um obejto do modelo deve ser agregado a visão para atualização ou isso não existe?
Não se preocupe que com 68704684013684068 mensagens que sua pergunta tem, o pessoal entendeu direitinho sua dúvida.
Só não precisa todo santo dia “floodar” seu tópico criando tentando “forçar” alguém a responder.
Isso pega mal pra você e o moderador pode até tomar a decisão extrema de te banir do guj ou apagar este tópico.
Seja paciente… se você reparar, o número de visitas ao seu tópico aumenta. Isso significa que o pessoal está olhando sua pergunta mas não sabe a resposta… então pelo amor de Deus aguarde que quando alguém souber, com certeza irá solucionar seu problema.
Fica aí o toque.
Oi Joca_java, obrigado por participar do tópico!
Nossa que vergonha!!! :oops: :oops: :oops:
Quero antes de mais nada realmente pedir minhas sinceras desculpas pelo desconforto que tenha lhe causado.
Àlias, quero pedir desculpas a todos os usuários do GUJ que na minha opinião é a mais importante e respeitada comunidade brasileira sobre Java.
Conheci o GUJ através da revista MundoJava a qual não perco uma edição. Cito a revista porque boa parte dos moderadores aqui do GUJ já escreveram diversas matérias importantes nela e por isso não quero que eles tenham uma imagem ruim da minha pessoa de forma alguma. Sei que são profissionais qualificados e que não estão aqui brincando e fazem o máximo para que os usuários evitem fraudar as regras de boa conduta no fórum.
Podem ter a certeza absoluta que de forma alguma eu quis causar qualquer tipo de transtorno aos usuários, em nenhum momento.
Como sou novo em Java muitas vezes eu acredito estar formulando mal as perguntas (tanto é verdade que, se puder claro, leia as respostas e veja como a pergunta inicial de meses atrás foi mutável até a data atual) e por isso acabo depois de um determinado tempo sem respostas reperguntando se há um entendimento da questão e até tento melhorar reformulando a mesma para ficar ainda melhor.
Mas nada justifica o meu erro que considerou. Dou toda a razão pela reclamação, entendo o seu lado também.
Volto a pedir desculpas e fico triste em saber que prejudiquei pessoas no lugar de estar colaborando com elas.
O que mais me envergonha :oops: (porém aprendi algo novo) é que “floodar” significa ficar reenviando pergunta. Eu pensei que era outra coisa ligada a questão de MVC. Se puder ler alguns tópicos anteriores o usuário edmarr havia postado algo com a palavra “flooder”. Mas se colocar no Google “MVC flooder” veja os resultados malucos que aparecem! :? :? :?
Mas agora já entendi o que significa, disfarça. :roll: Pode ter certeza que vou aguardar muito mais tempo por pelo menos uma resposta antes de perguntar se está ocorrendo algum problema com a pergunta!
Ah você falou sobre o número de visitas ir aumentando né? Se você digitar no Google “Pergunta MVC” olha lá o primeiro link que aparece.
Então acredito que muitas dessas visitas provavelmente devem ser de usuários que ainda não estão participando do GUJ e ficam limitados somente a ler, sem poder responder.
Por um lado incentiva a participação de novos usuários, eu espero!
Repetindo só posso lamentar e pedir desculpas a todos os companheiros Gujeiros.
E joca, mais uma vez agradeço pelo toque e pela força tentando ajudar. Quero que continue acompanhando o tópico. Espero que o inconveniente não atrapalhe no andamento do tópico. :thumbup:
É aquilo que eu sempre disse em tópicos anteriores: Uma crítica, opinião, sugestão, idéia serão sempre, sempre muito bem vindas!
Estou aqui com vocês porque realmente gosto do GUJ. Já visitava vocês a muito tempo antes de me cadastrar nele. As edições da MundoJava a muito tempo já divulgava o fórum.
[size=16]Fico no aguardo pelas respostas a pergunta que fiz nos dois tópicos anteriores a esse. Peço de coração, por favor, se souber orientar o mínimo que for sobre como resolver o problema não deixe de participar. Uma ajuda vale muito mais que mil explicações.[/size]
[color=red]
Agradeço muito o carinho e atenção de todos. Quero mandar um abraço aos companheiros fantomas, Bruno Laturner, André Fonseca, Sergio Taborda, Luis Tiagos, Tnaires, Leonardo Veríssimo, Marcos Henrique, Rodrigo Ferreira e todos que já colaboraram com o andamento do tópico e a todos que desprendem do seu tempo lendo e acompanhando na intensão de ajudar.[/color]
[color=blue][size=18]Obrigado! [/size].·.[/color]