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
Action X Observer
4 Respostas
1. Crie uma interface para os listeners desse evento, por exemplo:
/**
* 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);
}
2. 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.
/**
* Represent any events generated by the <tt>Connection</tt> 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);
}
}
List<ConnectionListener> 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);
}
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);
}
}
5. 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. 