Bom, é o seguinte, estou tendo dificuldades para fazer com que uma classe dispare um evento, pesquisei e encontrei materiais sobre Actions e Observers, e nao nao entendi muita coisa. A minha situacao, eh a seguinte:
Tenho uma classe que controla conexoes atravez de um socket, eu gostaria q esta classe dispara-se um evento toda vez que recebe-se uma nova conexao ou que uma conexao fosse terminada, para que posteriormente na parte grafica da aplicacao eu pude-se intercepta-lo e fazer o tratamento adequado.
Desde jah agradeço. valeu
- Crie uma interface para os listeners desse evento, por exemplo:
[code]/**
-
Define an interface for Connection listeners
/
public interface ConnectionListener extends EventListener
{
/*- Informs the stopping of the connection.
-
@param evt The ConnectionEvent that describes the problem.
*/
void connectionStopped(ConnectionEvent evt);
/**
- Informs that the connection was opened.
-
@param evt The ConnectionEvent describing the opening.
*/
void connectionOpened(ConnectionEvent evt);
}[/code]
- Crie o seu evento. Aqui não coloquei propriedade nenhuma, mas você pode colocar as propriedades que quiser.
Eventos diferentes devem ter classes diferentes, preferencialmente baseados numa superclasse.
[code]
/**
- Represent any events generated by the Connection object.
- @author Vendramin, Márcio
-
@author Mendonça, Vinícius Godoy de
*/
public class ConnectionEvent extends EventObject
{
/**Create a new connection event-
@param source The connection that generated the event.
*/
public ConnectionEvent(Object source)
{
super(source);
}
}[/code]
-
@param source The connection that generated the event.
- Na sua classe que controla conexões, crie um List para manter uma lista de listeners, e crie métodos em sua classe para adicionar e remover listeners. Geralmente é uma boa idéia criar uma superclasse da sua classe só para gerenciar esse tipo de coisa. Uma espécide de AbstractConnectionManager, por exemplo:
[code]List listeners = new ArrayList<ConnectionListener();
public void add(ConnectionListener listener) {
if (listener == null)
throw new NullPointerException(“Listener cannot be null!”);
listeners.add(listener);
}
public void remove(ConnectionListener listener) {
listeners.remove(listener);
}[/code]
- Crie métodos para disparar o evento. Passe como parâmetro as propriedades que irão dentro do evento, mas não o evento em si.
[code]public void fireConnectionOppened() {
ConnectionEvent evt = new ConnectionEvent(this);
for (Listener l : listeners) {
l.connectionOpened(evt);
}
}
public void fireConnectionStopped() {
ConnectionEvent evt = new ConnectionEvent(this);
for (Listener l : listeners) {
l.connectionStopped(evt);
}
}[/code]
- Chame esses métodos nos locais apropriados (após abrir uma conexão ou fecha-la).>
Valeu cara. muito obrigado, axo q agora consigo. valeu mesmo
E ae kras, apenar de ser um tópico antigo, me ajudou mto hje…
Eu estava usando, na minha classe de SOCKET, uma variável STATE. Ae o usuario da minha API teria q ficar num WHILE TRUE pra qnd a variável de status mudasse, ele faria o q tinha q fazer… A minha unica maneira de trocar informações com o usuario era essa variável. Mas fui procurar sobre fazer o Listener, para o usuario simplesmente dar implementação na minha interface, e graças a seu exemplo, ajudou bastante…
Valeu… Flw
Eu também uso esse pattern com Sockets e Channels. 