2009-01-12 4 views
7

Je suis un peu confus de ce que j'ai entendu dire que Java ne fait pas d'événements.Java a-t-il un support natif pour les événements, similaire à celui de C#?

Mais je sais qu'il fait des événements GUI.

Ai-je raté quelque chose? Est-ce que Java a un mécanisme de gestion d'événements? Je suis conscient que je peux implémenter un modèle d'abonné éditeur, mais je suis à la recherche de support natif dans Java.

Je semble me souvenir de quelque chose à propos de Java Ajout d'événements dans Java 5 ou 6, mais je ne me souviens pas où j'ai entendu cela et je peux le faire.

Fondamentalement, je suis enveloppant un périphérique dans une classe Java, le périphérique lance des événements, et je suis à la recherche de la façon la plus logique d'exposer cela. Je viens surtout d'un arrière-plan. Net et je cherche quelque chose comme les événements en .Net (C#)

Toute aide serait appréciée.

Répondre

14

Comme vous l'avez déjà indiqué, vous pouvez faire exactement la même chose avec le modèle éditeur-abonné/observateur. Cela nécessite juste un peu plus de jeu de jambes. Et non, Java n'a pas de support natif pour les événements, comme le fait C# avec les délégués.

-1

Vous avez besoin de threads. L'interface graphique dans Java a des événements, car il y a un thread dédié pour les événements de l'interface utilisateur à envoyer. Il y a aussi quelque chose de "Observer" et "Observable" (c'est la version neutre du goût des écouteurs de l'interface graphique) mais c'est juste le modèle de conception ...

1

D'après ce que je me souviens de Java (havre ' J'ai travaillé avec dans> 6 mois), je ne pense pas qu'il y ait des événements ala .NET. Votre meilleur pari sera probablement d'utiliser le modèle éditeur/abonné. C'est assez facile à mettre en œuvre et assez fiable.

0

Swing ou AWT, qui sont les boîtes à outils Java UI, les deux gérer des événements - consultez le official Swing event tutorial pour des exemples. Vous aurez besoin d'avoir écrit votre interface utilisateur dans Swing bien sûr pour pouvoir enregistrer les auditeurs pour ces événements.

+0

Je ne travaille pas avec une interface utilisateur malheureusement. –

+0

Cela signifie-t-il que pour chaque événement d'un objet swing particulier, il existe un pattern observable? Cela semble être beaucoup de code redondant. Cela signifierait un abonné/éditeur pour chaque événement. N'est-il pas possible simplement d'avoir une classe observable générique et d'utiliser une composition pour implémenter le modèle obervable. –

0

Je ne suis pas bien informé sur C#, mais Java Beans qui ne sont pas les composants d'interface peuvent certainement informer les auditeurs sur les changements d'état en utilisant des événements:

http://java.sun.com/developer/onlineTraining/Beans/beans02/

Cela a fait partie des Java Beans SPEC car il premier est sorti. Notez la date sur le tutoriel: c'est vintage 2000.

La source et l'écouteur doivent être exécutés dans la même JVM. Vous devriez utiliser un proxy pour communiquer avec quelque chose qui s'exécute dans une autre JVM, mais cela pourrait être fait.

J'ai recherché le tutoriel sur les événements C# et trouvé this. L'enregistrement des auditeurs par Java et le déclenchement des changements de propriété rappellent ce que j'ai vu lorsque j'ai écrémé le tutoriel C#. Ai-je manqué quelque chose d'important? (Je reconnais que je n'ai pas lu en profondeur - pas de temps pour le moment.)

0

Il n'y a pas de support natif en Java - vous devrez implémenter le Observer Pattern (alias Subcribe/Publish). C'est assez simple - pas plus d'une douzaine de lignes de code.

4

Le mécanisme d'abonnement/publication proposé par d'autres ici vous permettra d'implémenter événements synchrones. Pour les boucles d'événements asynchrones (fire and forget) Vous pouvez regarder des "acteurs". Un Actor<A> consiste en un gestionnaire pour les messages (événements) de type A, ainsi qu'une stratégie de thread pour l'exécution du gestionnaire. Cela vous permet de faire en même temps, un événement asynchrone de manutention comme les suivantes:

public class EventExample { 
    public static void main(String[] args) { 
    while ((char c = System.in.read()) >= 0) { 
     eventHandler.act(c); 
    } 
    } 

    public static Actor<Character> eventHandler = 
    Actor.actor(Strategy.simpleThreadStrategy(), new Effect<Character>() { 
     public void e(Character c) { 
     // Do something with c here. 
     } 
    }); 
} 

Get the actors library here. See the Javadoc here.

0

Vous pouvez également jeter un oeil à la bibliothèque source de EventBus ouverte, qui, contrairement à l'éditeur standard/Le modèle d'abonné utilise une classe médiateur (le bus d'événement) afin de réduire le couplage serré requis dans le modèle éditeur/abonné (où les abonnés doivent connaître tous les éditeurs pour s'enregistrer, ce qui n'est pas toujours possible et souvent lourd). Je l'ai utilisé dans des applications graphiques, mais il peut gérer tout type d'événement.