Event en Java.

codeur67 Messages postés 9 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 25 mai 2011 - 9 mars 2009 à 18:47
codeur67 Messages postés 9 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 25 mai 2011 - 10 mars 2009 à 16:32
Bonjour. Je cherche à coder un soft d'IM avec le protocole Skype et avec le package Skype4Java. J'ai besoin de créer un Listener sur l'objet contact_list (de type ContactList) : quand il change (que quelqu'un a rajouté une entrée), je voudrais que mon Listener déclenche un Event de façon à ce que je puisse gérer l'Event. Je suis débutant et j'ai vraiment besoin d'aide.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.Date;
import java.util.HashMap;

import com.skype.*;

public class SKYPE_Connector {

    /**
     * @param args
     */
    private static Chat my_chat = null;
    private static ChatMessageListener cml = null;
    private static ContactList contact_list = null;
    private static HashMap<String, Friend> amis = null;
    private static String with_this_person = "moni.sm";

    public static void main(String[] args) throws SkypeException {

        final SKYPE_Connector skc = new SKYPE_Connector();
        skc.init();
        System.out.println("*** CHAT ***");
        try {
            my_chat = Skype.chat(with_this_person);// this is the person I want
                                                    // to chat with
        } catch (SkypeException e) {
            e.printStackTrace();
        }
        /*
         * String message = ""; while (message.compareToIgnoreCase("quit") != 0)
         * { message = skc.readString("Ecrivez votre message : "); try { if
         * (message.compareToIgnoreCase("quit") != 0) my_chat.send(message); }
         * catch (SkypeException e) { e.printStackTrace(); } }
         */
        System.out.println("Before".toUpperCase());
        amis = skc.displayFriends();

        System.out.println("\nThen".toUpperCase());
        System.out
                .println("Withdrawing jean.christophe.dufau from the friends' list :");
        skc.deleteFriend("jean.christophe.dufau");
        amis = skc.displayFriends();

        skc
                .readString("\nLook at Skype's friends' list and then hit Entrée to continue"
                        .toUpperCase());

        System.out.println("\nAfter".toUpperCase());
        System.out
                .println("Adding jean.christophe.dufau to the friends' list again :");
        skc.addNewFriend("jean.christophe.dufau");
        amis = skc.displayFriends();

        skc.readString("Hit Entrée to finish".toUpperCase());

        System.exit(0);
    }

    // FUNCTIONS

    private void addNewFriend(String the_id) throws SkypeException {
        amis.put(the_id, new Friend(the_id));
        contact_list.addFriend(the_id, "RAJOUT AUX AMIS");
    }

    private void deleteFriend(String the_id) throws SkypeException {
        contact_list.removeFriend(amis.get(the_id));
        amis.remove(the_id);
    }

    private String currentTime() {
        return new Date().toString().substring(11, 19);
    }

    private void allowFriends() throws SkypeException {
        Friend[] fwfa = contact_list.getAllUserWaitingForAuthorization();
        for (int i = 0; i < fwfa.length; i++) {
            fwfa[i].setAuthorized(true);
        }
    }

    private HashMap<String, Friend> displayFriends() throws SkypeException {
        contact_list = Skype.getContactList();
        HashMap<String, Friend> amis = new HashMap<String, Friend>();

        allowFriends();

        Friend[] f = contact_list.getAllFriends();
        System.out.println("Vous avez " + f.length + " amis.");
        for (int i = 0; i < f.length; i++) {
            amis.put(f[i].getId(), f[i]);
            if (i > 0)
                System.out.print(", " + f[i]);
            else
                System.out.print(f[i]);
        }
        System.out.print(".\n\n");

        return amis;
    }

    private String readString(String invite) {
        String outbound_message = "";
        Reader reader = new InputStreamReader(System.in);
        BufferedReader input = new BufferedReader(reader);
        System.out.print(invite);
        try {
            outbound_message = input.readLine();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return outbound_message;
    }

    private void init() throws SkypeException {

        cml = new ChatMessageListener() {

            @Override
            public void chatMessageReceived(ChatMessage arg0)
                    throws SkypeException {
                SKYPE_Connector skc = new SKYPE_Connector();
                System.out.println("Message received at " + skc.currentTime()
                        + " !");
                System.out.println("-> " + arg0.getSender() + " says : '"
                        + arg0.getContent() + "' at " + arg0.getTime() + ".");
            }

            @Override
            public void chatMessageSent(ChatMessage arg0) throws SkypeException {
                SKYPE_Connector skc = new SKYPE_Connector();
                System.out.println("Message sent at " + skc.currentTime()
                        + " !");
                System.out.println("-> " + arg0.getSender() + " sent : '"
                        + arg0.getContent() + "' at " + arg0.getTime() + ".");
            }

        };
    }
}

Merci.

Jean-Christophe

6 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
9 mars 2009 à 19:15
Salut,

Ok mais c'est quoi ton problème au juste ? Je ne vois aucun listener dans tout ton code là.
______________________________________
DarK Sidious
0
codeur67 Messages postés 9 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 25 mai 2011
10 mars 2009 à 14:06
Si, il y a cml dans la fonction init(). Il gère les entrées et sorties de messages et fonctionne bien. Il était facile à coder car skype.jar contient une méthode ChatMessageListener. Par contre, skype.jar ne contient pas de Listener lié aux variations de la ContactList (objet : contact_list) et je devrais donc créer sur mesure ce Listener-là, qui réagira à la modification de l'objet contact_list.
Seulement, je ne sais pas comment faire. Créer un Listener sur mesure est difficile.

Merci de m'aider

Jean-Christophe
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
10 mars 2009 à 14:26
Salut,

Ce n'est pas si difficile que cà de créer un listener :

Voici le "listener" en question : une simple interface
public interface ListenerTest {
    /**
     * Méthode qui sera déclenchée par le listener
     */
    public void changed() {
    }
}

Code à rajouter dans ta classe qui doit permettre de déclencher des listeners :
private List<ListenerTest> listeListeners = new LinkedList<ListenerTest>();

public void addListenerTest(ListenerTest listener) {
    listeListeners.add(listener);
}

public void removeListenerTest(ListenerTest listener) {
    listeListeners.remove(listener);
}

Et enfin, lorsque tu veux déclencher l'événement dans ton code :
for(ListenerTest listener : listeListeners) {
    listener.changed();
}

Voilà, c'est pas plus compliqué que cà
______________________________________
DarK Sidious
0
codeur67 Messages postés 9 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 25 mai 2011
10 mars 2009 à 16:13
Merci beaucoup ! Mais où intervient l'objet contact_list, dont je veux surveiller les changements ? Je ne le vois nulle part.

JC
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
10 mars 2009 à 16:16
Salut,

Je ne t'ai montrer que ce que tu m'as demandé : comment mettre en place un listener sur mesure. Par contre, c'est à toi maintenant de trouver l'algorithme pour savoir quand le déclencher...
______________________________________
DarK Sidious
0
codeur67 Messages postés 9 Date d'inscription dimanche 26 octobre 2008 Statut Membre Dernière intervention 25 mai 2011
10 mars 2009 à 16:32
Merci, Leader des Forces Obscures, mais cela éclaire le pauvre débutant que je suis autant que le casque de Darth Vador ... hélas. Je croyais que justement, une fois qu'un Listener était rajouté à la connection (ex : Skype.addChatMessageListe
ner(cml); pour les messages entrants et sortants), il avait pour intérêt de se déclencher automatiquement. Ici, le problème est qu'il n'existe pas de commande nommée, par exemple, addContactListener.

JC
0
Rejoignez-nous