Seguinte, estou montando uma aplicação SoketServer, tenho uma classe que guarda todos os dados da aplicação (conexões ativas, inativas, aguardando resposta, finalizadas, etc…)
Cada vez que um cliente se conecta a aplicação dispara uma nova Thread e alimenta esses valores…
Como é uma aplicação swing, estarei exibindo estes dados em realtime no front-ent no formato de número e gráficos.
:?: Ai que vem minha dúvida: Tenho como adicionar um evento para monitorar a mudança destes atributos? Assim, automaticamente quando estes valores mudarem eles serão atualizados no front-end
:idea: Pensei em criar uma Thread para isso, mas imaginei que deve ter uma forma mais simples.
Eu não entendi muito bem a situação, mas acredito que se vc utiliza-se um padrão como o Observer resolveria o seu problema!!!
Só acho que teria que ver como ficaria a carga na rede…
O Observer funciona como o esquema de listeners do swing, vc pode ter uma lista do objetos que estão olhando para o modelo de dados (no caso os dados que serão apresentados), e sempre que este for alterado, vc manda uma mensagem para os objetos pertencentes a lista de observadores.
black_fire
Olha eu respondendo eu mesmo…
puts, consegui…
O único problema é que não consigo disprar os eventos para cada atributo apenas para a classe inteira, mas até ai blz, já vai quebra um galhão. Como já tá tarde pacas amanhã vou dar mais uma olhada. Mas acho que eu tô quase lá… Apesar que o que já consegui até aki, vai ajuda bastante.
Como eu sou um dos poucos loucos que usa Swing :shock: , segue abaixo o cógo pra se algum dia outro kra maluco aparecer por aki. Vou ver se amanhã, consigo dispara os eventos para cada atributo…
/*by Rodrigo G. Tavares de Souza*/importjava.awt.AWTEvent;importjava.awt.Component;importjava.awt.GridLayout;importjava.awt.Toolkit;importjava.awt.event.ActionEvent;importjava.awt.event.ActionListener;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;importjava.util.EventListener;importjavax.swing.JButton;importjavax.swing.JFrame;importjavax.swing.JLabel;importjava.awt.EventQueue;publicclassTestaEventosextendsJFrameimplementsAtributosListener{publicstaticvoidmain(String[]args){TestaEventosapp=newTestaEventos();}publicTestaEventos(){atributos=newAtributos();// adiciona o evento na lista de eventosatributos.addTotalChangeListener(this);addWindowListener(newWindowAdapter(){publicvoidwindowClosing(WindowEventevt){System.exit(0);}});setResizable(false);GridLayoutg=newGridLayout(3,2);getContentPane().setLayout(g);jLblTotal=newJLabel("Total");jLblVlrTotal=newJLabel("0");jLblAtivo=newJLabel("Ativo");jLblVlrAtivo=newJLabel("0");jBtnIncTotal=newJButton(" + ");jBtnDecAtivo=newJButton(" - ");getContentPane().add(jLblTotal);getContentPane().add(jLblVlrTotal);getContentPane().add(jLblAtivo);getContentPane().add(jLblVlrAtivo);getContentPane().add(jBtnIncTotal);getContentPane().add(jBtnDecAtivo);jBtnIncTotal.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){atributos.incTotal();}});jBtnDecAtivo.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEventevt){atributos.decAtivo();}});pack();show();}// Este metodo é disparado quando a classe Atributos sofre uma alteraçãopublicvoidatributosChange(AtributosEventevt){jLblVlrAtivo.setText(String.valueOf(atributos.getAtivo()));jLblVlrTotal.setText(String.valueOf(atributos.getTotal()));}Atributosatributos;JLabeljLblTotal;JLabeljLblVlrTotal;JLabeljLblAtivo;JLabeljLblVlrAtivo;JButtonjBtnIncTotal;JButtonjBtnDecAtivo;}finalclassAtributosextendsComponent{publicAtributos(){// Solicita a inclusão do envento na lista de eventosevtq=Toolkit.getDefaultToolkit().getSystemEventQueue();// Habilita o evento na lista de eventosenableEvents(0);}publicvoidincTotal(){ativo++;total++;// comunica uma alteraçào na classesendEvent();}publicvoiddecAtivo(){if(ativo>0)ativo--;// comunica uma alteraçào na classesendEvent();}publicintgetAtivo(){returnativo;}publicintgetTotal(){returntotal;}// Informa que houve uma alteração na classe, disparando o evento... privatevoidsendEvent(){AtributosEventae=newAtributosEvent(this);evtq.postEvent(ae);}// Este metodo inclui uma instância do objeto na lista de ouvintes// os eventos não serão disparados...publicvoidaddTotalChangeListener(AtributosListenera){listener=a;}// Verifica se evento foi disparado e a procedência do evento... publicvoidprocessEvent(AWTEventevt){if(evtinstanceofAtributosEvent){if(listener!=null){listener.atributosChange((AtributosEvent)evt);}}elsesuper.processEvent(evt);}privateintativo;privateinttotal;privateAtributosListenerlistener;privatestaticEventQueueevtq;}interfaceAtributosListenerextendsEventListener{publicvoidatributosChange(AtributosEventevt);}classAtributosEventextendsAWTEvent{// Atribui um código para a lista de eventos// a constante AWTEvent.RESERVED_ID_MAX informa qual o código máximo// utilizado pelo awt, desta forma o código do evento deve// estar fora deste range...publicAtributosEvent(Atributosa){// contrói uma ligação entre o objeto e código do evento...super(a,ATRIBUTO_ID_EVENT);}publicstaticfinalintATRIBUTO_ID_EVENT=AWTEvent.RESERVED_ID_MAX+31103;}
black_fire
“TedLoprao”:
Eu não entendi muito bem a situação, mas acredito que se vc utiliza-se um padrão como o Observer resolveria o seu problema!!!
Só acho que teria que ver como ficaria a carga na rede…
O Observer funciona como o esquema de listeners do swing, vc pode ter uma lista do objetos que estão olhando para o modelo de dados (no caso os dados que serão apresentados), e sempre que este for alterado, vc manda uma mensagem para os objetos pertencentes a lista de observadores.
Vixi, tava postando a msg quando você mandou uma resposta.
Andei procurando no google algo sobre Observer e achei um tutorial, pelo que vi na descrição é mais ou menos o meu problema. Tenho uma classe que pode ser acessada por várias Threads diferentes e preciso monitorar esta classe para exibir os dados sempre que ela sofre uma alteração.
:arrow: Vou dar uma garimpada pra ver se o Observer é mais fácil de implementar do que o que eu fiz acima.