web-dev-qa-db-fra.com

Créer un événement personnalisé dans Java

Je veux faire quelque chose comme ceci dans Java mais je ne connais pas le chemin:

Lorsque l'événement "L'objet 1 dit 'Bonjour'" se produit, l'objet 2 répond à cet événement en disant "Bonjour".

Quelqu'un peut-il me donner un indice ou un exemple de code?

183
conmadoi

Vous voudrez probablement vous pencher sur le motif observateur .

Voici un exemple de code pour vous aider à démarrer:

import Java.util.*;

// An interface to be implemented by everyone interested in "Hello" events
interface HelloListener {
    void someoneSaidHello();
}

// Someone who says "Hello"
class Initiater {
    private List<HelloListener> listeners = new ArrayList<HelloListener>();

    public void addListener(HelloListener toAdd) {
        listeners.add(toAdd);
    }

    public void sayHello() {
        System.out.println("Hello!!");

        // Notify everybody that may be interested.
        for (HelloListener hl : listeners)
            hl.someoneSaidHello();
    }
}

// Someone interested in "Hello" events
class Responder implements HelloListener {
    @Override
    public void someoneSaidHello() {
        System.out.println("Hello there...");
    }
}

class Test {
    public static void main(String[] args) {
        Initiater initiater = new Initiater();
        Responder responder = new Responder();

        initiater.addListener(responder);

        initiater.sayHello();  // Prints "Hello!!!" and "Hello there..."
    }
}

Article associé: Java: création d'un événement personnalisé

397
aioobe

Ce que vous voulez, c'est une implémentation du observateur pattern . Vous pouvez le faire vous-même complètement ou utiliser les classes Java comme Java.util.Observer et Java.util.Observable

27
Bozho

Il y a 3 façons différentes de configurer ceci:

  1. Thrower à l'intérieur de Catcher
  2. Catcher à l'intérieur de Thrower
  3. Thrower et Catcher à l'intérieur d'une autre classe dans cet exemple Test

EXEMPLE DE GITHUB DE TRAVAIL JE SUIS ENTRAÎNANT La valeur par défaut de Option 3, pour essayer les autres simplement décommenter le "Optional _ "bloc de code de la classe que vous voulez être principale et définissez cette classe comme variable ${Main-Class} dans le fichier build.xml:

4 Choses nécessaires sur le code côté lancement:

import Java.util.*;//import of Java.util.event

//Declaration of the event's interface type, OR import of the interface,
//OR declared somewhere else in the package
interface ThrowListener {
    public void Catch();
}
/*_____________________________________________________________*/class Thrower {
//list of catchers & corresponding function to add/remove them in the list
    List<ThrowListener> listeners = new ArrayList<ThrowListener>();
    public void addThrowListener(ThrowListener toAdd){ listeners.add(toAdd); }
    //Set of functions that Throw Events.
        public void Throw(){ for (ThrowListener hl : listeners) hl.Catch();
            System.out.println("Something thrown");
        }
////Optional: 2 things to send events to a class that is a member of the current class
. . . go to github link to see this code . . .
}

2 éléments nécessaires dans un fichier de classe pour recevoir des événements d'une classe

/*_______________________________________________________________*/class Catcher
implements ThrowListener {//implement added to class
//Set of @Override functions that Catch Events
    @Override public void Catch() {
        System.out.println("I caught something!!");
    }
////Optional: 2 things to receive events from a class that is a member of the current class
. . . go to github link to see this code . . .
}
21
GlassGhost

Ce qui suit n'est pas exactement le même mais similaire, je cherchais un extrait pour ajouter une méthode d'appel à interface, mais j'ai trouvé cette question, alors j'ai décidé d'ajouter cet extrait pour ceux qui le recherchaient comme moi et j'ai trouvé cette question:

 public class MyClass
 {
        //... class code goes here

        public interface DataLoadFinishedListener {
            public void onDataLoadFinishedListener(int data_type);
        }

        private DataLoadFinishedListener m_lDataLoadFinished;

        public void setDataLoadFinishedListener(DataLoadFinishedListener dlf){
            this.m_lDataLoadFinished = dlf;
        }



        private void someOtherMethodOfMyClass()
        {
            m_lDataLoadFinished.onDataLoadFinishedListener(1);
        }    
    }

L'utilisation est la suivante:

myClassObj.setDataLoadFinishedListener(new MyClass.DataLoadFinishedListener() {
            @Override
            public void onDataLoadFinishedListener(int data_type) {
                }
            });
1
Ivan