seguinte: to fazendo um sistema e estou utilizando o framework SwingBean pra gerar os formularios e tabelas.( Pra quem naum sabe o swingbean monta um formulario atraves de um XML e um Bean e faz binding do formulario com o bean). Tenho uma tela onde eu tenho 3 formulários desse para um mesmo bean, apenas por questão de estetica. Até ae tudo bem. Uso o mesmo bean para o hibernate e para o swingbean. Mas agora preciso saber qdo o bean é modificado para adicionar uma funcionalidade de salvar o objeto, para que o usuário não saia da tela do bean sem salva-lo. Minha pergunta é se alguem saberia de alguma solução para isso. Eu pesquisei sobre o designer pattern Observer, mas ai não sei bem se eh uma boa escolha fazer as classes de entidade estenderem a classe Observable, além de não conseguir fazer funcionar.
Ele é composto de uma [i]interface /i e uma [b]classe /b. Você deve implementar a interface Observer nas classes que você deseja que “recuperem” as modificações das classes observadas, lembrando que o método implementado update() será invocado a cada mensagem da Observable.
Já as classes que você deseja que tenham suas ações “avisadas” às outras classes, você precisará estender Observable e não esquecer de utilizar o método addObserver() para adicionar qual classe receberá a mensagem e terá seu método update() acionado.
Então, isso q vc falou eu já fiz, mas em um projeto separado. Achu q o swingbean altera de alguma forma essa questão do Observer para fazer alguma funcionalidade, como o de sincronizar o bean com o formulario. Mas infelizmente como tenho mais de 1 formulario, como dito anteriormente se tento sincronizar os tres formularios em um unico bean, me acusa erro, por isso vim até o forum. Além disso, eh legal fazer a classe de entitidade do hibernate estender a classe observable?
Quanto a alguma limitação do Swingbean junto ao Observer, realmente desconheço.
Agora considerando o uso do Observer na Entity do Hibernate, acredito não seu uma boa solução, o ideal é criar uma camada anterior, por exemplo usando um Design Pattern Facade, ou na controller pensando em MVC.
Quanto aos 3 formulários, eles podem sem nenhum problema serem observados por uma mesma classe. Basta adicionar em cada Observable (addObserver()) a classe que implementa Observer.
Então, achu q meio q viajei seguinte: eu to fazendo um teste com Observable e Observer, então criei duas classes:
Sala
package entidades;
import java.util.Date;
import java.util.Observable;
public class Sala extends Observable{
private String nome;
private Integer numero;
private Date data;
private Boolean ocupada;
public Sala() {
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public Integer getNumero() {
return numero;
}
public void setNumero(Integer numero) {
this.numero = numero;
}
public Date getData() {
return data;
}
public void setData(Date data) {
this.data = data;
}
public Boolean isOcupada() {
return ocupada;
}
public void setOcupada(Boolean ocupada) {
this.ocupada = ocupada;
}
}
e SalaObserver
package entidades;
import java.util.Observable;
import java.util.Observer;
public class SalaObserver implements Observer {
public SalaObserver() {
}
public void update(Observable o, Object arg) {
System.out.println("Chamou aki!");
}
}
e o teste q faço:
Sala sala = new Sala();
SalaObserver obs = new SalaObserver();
sala.addObserver(obs);
sala.setData(new Date());
sala.notifyObservers();
então pelo q eu entendi qdo qq propriedade for alterada o observer será ativado certo? ou apenas no metodos q eu chamar setChanged()? Pq se pra cada atributo q eu quiser observar eu tiver q chamar o setChanged(), vai ficar dificil, pois em uma tabela eu tenho 34 atributos!! vou ter q chamar esse metodo em cada set?!!? pois quero saber qdo houver QUALQUER alteração no bean.
cabeçada minha até já alterei o post anterior, então pra cada atributo tenho q chamar o setChanged()?!? oh hell…ae azedou…imagine colocar 34 setChanged…vai poluir o codigo…q droga…naum tem nenhuma outra opção pra resolver esse problema?
Leokas,
Estou começando desenvolver utilizando o FrameWork SwingBean( apenas em fase de teste para ver se funcionaria como eu quero em uma aplicação real)
nesse caso não seria legal fazer uma comparação com o bean inicial e o bean sincronizado(binding)?
Ai daria para saber se ele foi modificado
então tem 2 problemas nessa solução: primeiro, para fica melhor a visualização desse formulario eu dividi em 6 formularios o bean pq ele tem 30 campos, entaum se vc tentar fazer binding nos 6 forms, vai dar erro, acredite eu jah tentei essa solução. Além disso, eu preciso saber quando o bean for modificado para assim habilitar o botão de salvar, realmente eu conseguiria fazer a comparação entre beans comparando atributo a atributo, e mesmo utilizando reflection para não precisar fazer um if com 60 gets, eu não saberia exatamente quando ele foi modificado. E mesmo assim eu teria q colocar pra cada set um firePropertyChange, o q eu achu q seria uma gambiarra, e ainda alterando o objeto de negocio do hibernate. tenso viu…
Eu vou enfrentar o mesmo problema que você
eu já estou estendendo algumas classes do Swing Bean e adequando algumas para minhas necessidades
E vou precisar fazer isso que você mesmo falou.
Criar formulários separados para melhor visualização, e passar para 1 único Bean, mais acredito que isso é fácil adaptar no Swing bean isso.
Além do mais meus formulários acessa varios Beans ao mesmo tempo, não cheguei nessa parte para ver se vou enfrentar problemas.