Logo

Logo

domingo, 21 de febrero de 2016

1.4. Creación de eventos

Para la creación de eventos es necesario definir sobre que componente se desea crear dicho evento.


El siguiente ejemplo muestra una clase, ListWithChangedEvent, similar a la clase estándar ArrayList, pero también llama a un evento Changed cuando el contenido de la lista cambia. Una clase de propósito general como esa podría utilizarse de muchas formas en un programa extenso.

Por ejemplo, un procesador de textos podría mantener una lista de los documentos abiertos. Cuando la lista cambia, puede que sea necesario notificarlo a diferentes objetos del procesador de textos para poder actualizar la interfaz de usuario. Mediante el uso de eventos, el código que mantiene la lista de documentos no necesita saber quién necesita notificación (una vez que se cambia la lista de documentos, se llama automáticamente al evento y se notifica correctamente a todos los objetos que lo necesitan). Mediante el uso de eventos, la modularidad del programa se incrementa.

// events1.cs
using System;
namespace MyCollections
{
   using System.Collections;

   // A delegate type for hooking up change notifications.
   public delegate void ChangedEventHandler(object sender, EventArgs e);

   // A class that works just like ArrayList, but sends event
   // notifications whenever the list changes.
   public class ListWithChangedEvent: ArrayList
// An event that clients can use to be notified whenever the
      // elements of the list change.
      public event ChangedEventHandler Changed;

      // Invoke the Changed event; called whenever list changes
      protected virtual void OnChanged(EventArgs e)
      {
         if (Changed != null)
            Changed(this, e);
      }

      // Override some of the methods that can change the list;
      // invoke event after each
      public override int Add(object value)
      {
         int i = base.Add(value);
         OnChanged(EventArgs.Empty);
         return i;
      }

      public override void Clear()
      {
         base.Clear();
         OnChanged(EventArgs.Empty);
      }

      public override object this[int index]
      {
         set 
         List = list;
         // Add "ListChanged" to the Changed event on "List".
         List.Changed += new ChangedEventHandler(ListChanged);
      }

      // This will be called whenever the list changes.
      private void ListChanged(object sender, EventArgs e)
      {
         Console.WriteLine("This is called when the event fires.");
      }

      public void Detach()
      {
         // Detach the event and delete the list
         List.Changed -= new ChangedEventHandler(ListChanged);
         List = null;
      }
   }

   class Test
   {
      // Test the ListWithChangedEvent class.
      public static void Main()
      {
      // Create a new list.
      ListWithChangedEvent list = new ListWithChangedEvent();

Resultado

This is called when the event fires.This is called when the event fires.
Declaración de un evento; para declarar un evento dentro de una clase, primero debe declararse un tipo delegado para el evento si aún no existe uno declarado.
public delegate void ChangedEventHandler(object sender, EventArgs e);

El tipo delegado define el conjunto de argumentos que se pasan al método que realiza el tratamiento del evento. Varios eventos pueden compartir el mismo tipo delegado, de modo que este paso sólo es necesario si aún no se ha declarado ningún tipo delegado.

El tipo delegado define el conjunto de argumentos que se pasan al método que realiza el tratamiento del evento. Varios eventos pueden compartir el mismo tipo delegado, de modo que este paso sólo es necesario si aún no se ha declarado ningún tipo delegado.

Detectar pulsación de tecla Enter en C# - Evento KeyPress

1.3. Métodos de control de eventos

Ejemplos de componentes que pueden generar eventos: 
Button. Genera eventos de acción (ActionEvent) cuando se presiona el botón. 
Checkbox. Genera eventos de elementos (ItemEvent) cuando se selecciona o deselecciona un checkbox. 
Choice. Genera eventos de elementos cuando se cambia de opción choice. 
List. Genera eventos de acción cuando se hace doble click sobre un elemento, genera eventos de elemento cuando se selecciona o deselecciona un elemento. 
Menu Item. Generá eventos de acción cuando se selecciona un elemento de menú; genera eventos del elemento cuando se selecciona o se deselecciona un elemento de un menú de opciones. 
Scrollbar. Genera eventos de ajuste (AdjustmentEvent) cuando se manipula el scrollbar. 
Text components. Genera eventos de texto (TextEvent) cuando el usuario introduce un carácter. 
Window. Genera eventos de ventana (WindowEvent) cuando una ventana se activa, se cierra, se desactiva, se minimiza, se maximiza, se abre o se sale de ella.


Se pueden utilizar los eventos para notificar a los objetos situaciones especiales. Es posible asociar métodos a eventos particulares; dichos métodos se denominan controladores de eventos (en inglés, event handlers). Cuando se provoca un evento, se ejecutan los controladores que lo reciben. Los eventos pueden asignarse a múltiples controladores, y los métodos que controlan determinados eventos pueden modificarse de manera dinámica.
Un controlador de eventos es un procedimiento del código que determina las acciones que se han de ejecutar cuando se produce un evento, como cuando un usuario hace clic en un botón o una cola recibe un mensaje. Cuando se produce un evento, se ejecuta el controlador o los controladores de eventos que reciben dicho evento. Los eventos se pueden asignar a varios controladores, y los métodos que controlan los distintos eventos se pueden cambiar dinámicamente


Control ComboBox


1.2. Generación y propagación de eventos

El paquete java.awt.event es el que contiene la mayor parte de las clases e interfaces de eventos. El modelo de delegación de eventos es un concepto que trabaja de la siguiente manera: Una fuente genera un evento y lo envía a uno a más oyentes o auditores, que han estado simplemente esperando hasta que reciben ese evento y una vez recibido lo procesan y lo devuelven. Una fuente es un objeto que genera un evento. Esto ocurre cuando cambia de alguna manera el estado interno de ese objeto. Las fuentes pueden generar más de un tipo de eventos. Una fuente tiene que ir acompañada de auditores para que estos reciban las notificaciones sobre el tipo específico de evento, cada tipo de evento tiene su propio método de registro. Un auditor es un objeto que es avisado cuando ocurre un evento. Tiene dos requisitos principales. Primero tiene que ser registrado o ir acompañado por una o más fuentes para recibir notificaciones sobre los tipos específicos de eventos. Segundo, tiene que implementar métodos para recibir y procesar notificaciones.

Explicación del sistema de propagación de eventos en Actionscript 3.flv

El ejemplo siguiente muestra cómo declarar y generar un evento que utiliza EventHandler como tipo de delegado subyacente.




Los eventos son un tipo especial de delegado multidifusión que sólo se puede invocar desde dentro de la clase o struct donde se declaran (la clase de editor). Si otras clases o structs se suscriben al evento, se llamará a sus métodos de control de eventos cuando la clase de editor genere el evento.
Los eventos se pueden marcar como public, private, protected, internal o protectedinternal. Estos modificadores de acceso definen cómo los usuarios de la clase pueden tener acceso al evento.

ASP.NET vNext - Smart Tasks y generación de eventos de controles desde la vista HTML

1.1. Tipos de eventos

Eventos en Java

Eventos de bajo nivel.
Eventos semánticos. 
Representan entradas o interacciones de bajo nivel con elementos del interfaz gráfico (Cambio de tamaño, cambio del foco, operación con el ratón o con el teclado).


Eventos de alto nivel que encapsulan la semántica del modelo de componentes del interfaz de usuario (Hacer una acción, un cambio de estado en un elemento, etc.). 
No están relacionados con una clase específica de componente sino que pueden aplicarse a todos los componentes que implementen un modelo semántico similar.


Static: Hace que el evento esté siempre disponible para los llamadores, aunque no exista ninguna instancia de la clase.
Virtual: Permite que las clases derivadas reemplacen el comportamiento del evento mediante la palabra clave override.
Sealed: Especifica que el evento ya no es virtual para las clases derivadas.
Abstract: El compilador no generará los bloques de descriptor de acceso a eventos add y remove y, por tanto, las clases derivadas deben proporcionar su propia implementación.