![]() |
![]() |
![]() |
![]() |
Graphics, que encapsula las capacidades nativas de dibujo del sistema operativo Windows.
Este objeto proporciona diversas funciones para las operaciones de dibujo más comúnmente utilizadas,
como mostrar imágenes e iconos y dibujar líneas, polígonos y texto.
El objeto Graphics realiza su trabajo incluyendo un contexto de dispositivos de Windows, una estructura
de datos del sistema que define los objetos gráficos del sistema, sus atributos asociados y los modos
gráficos que afectan a los datos de salida del dispositivo.
|
|||||
Eventos WFC |
|||||
---|---|---|---|---|---|
Crear en WFC |
a Full |
||||
mucha Clase |
|||||
Primer Applets |
y Hora |
||||
en NetBeans |
Java |
Además, todos los objetos que se derivan del objeto Image, como Bitmap, Icon y Metafile, admiten la creación y recuperación de su objeto Graphics asociado a través del método getGraphics.
Componentes visuales de HTML dinámico
Los elementos de HTML dinámico componen el segundo conjunto de componentes visuales de WFC. Los controles existentes encom.ms.wfc.html están basados en el modelo de objetos de HTML dinámico.
Las clases de com.ms.wfc.html se utilizan para crear nuevos elementos y también para crear enlaces con elementos existentes en una página HTML.
Dichos componentes se pueden crear y manipular en un explorador cliente o en un servidor, que los envía a un explorador cliente.
Este modelo de objetos está presente para varias plataformas. Por consiguiente, no se basa fundamentalmente en Win32, aunque los controles de interfaz de usuario tiendan a ser similares, dado que el conjunto estándar de botones, cuadros de lista, botones de opción, etc., están presentes en ambas plataformas.
Los dos conjuntos de controles WFC (Win32 y HTML dinámico) tienen una base similar porque se derivan en última instancia decom.ms.wfc.core.Component.
Un componente es un elemento que puede estar albergado un contenedor y ser compatible con la interfazIComponent, que tiene métodos para albergar el componente.
La forma en que los componentes y los contenedores se asignan no supone una gran preocupación para la mayoría de los programadores que utilizan WFC; sin embargo, puesto que los elementos de com.ms.wfc.html y com.ms.wfc.ui están basados en componentes, presentan características parecidas.
Por ejemplo, todos los componentes se agregan a su contenedor primario mediante el método add.
EVENTOS en WFC
La clase base Control y sus clases derivadas, como botones y cuadros de edición, exponen eventos estándar de Windows como click, keyPress, mouseMove, dragDrop y otros.
Puede trabajar con un evento de su aplicación usando delegados. No es necesario comprender este concepto con gran detalle para crear controladores de eventos en una aplicación.
Sin embargo, comprender cómo crearlos y utilizarlos es útil si piensa generar controles, trabajar con otras aplicaciones que desencadenan eventos, o utiliza subprocesos con componentes WFC.
También es interesante si desea comprender los detalles del código Java generado por el Diseñador de formularios.
Esta sección proporciona información básica acerca de los delegados y a continuación trata los aspectos prácticos del manejo de eventos.
¿Qué es un delegado? Una declaración de delegado define una clase que se deriva de com.ms.lang.Delegate.
El compilador de JVC también reconocedelegate como palabra clave y proporciona un método abreviado para crear una clase basada en delegate.
Una instancia de delegate puede llamar a un método en un objeto y pasar datos a ese método.
Lo que es más importante, el delegado se aísla del objeto al que hace referencia y no necesita recibir información de él.
Por ello, es ideal para las "llamadas anónimas". En otros lenguajes, esta característica se implementa como un puntero de función. No obstante, a diferencia de los punteros de función, los delegados están orientados a objetos, admiten el uso seguro de tipos y son seguros.
En WFC los delegados se usan sobre todo para enlazar eventos con métodos de controlador, como un evento click en un botón de botón a un método de controlador de su clase.
Cuando se produce el evento, el control llama al delegado, pasándole la información del evento. El delegado, a su vez, llama al método de controlador registrado y le pasa los datos del evento.
También puede utilizar delegados para enlazar un evento con más de un método (proceso denominado multicasting o enlace múltiple).
Cuando se produce el evento, cada delegado de la lista es llamado en el orden en que se agregó. Por otro lado, a los delegados de eventos diferentes puede asignárseles el mismo método de controlador (así, un botón de barra de herramientas y un elemento de menú pueden llamar a ambos al mismo controlador).
Para trabajar con eventos en la aplicación, utilice un delegado si desea registrarse y obtener notificación cuando se produzca ese evento en un control específico.
Para ello, llame al método addOn Por ejemplo, para registrar el evento click de un botón, llame al método addOnClick del objeto de botón.
METODO ADDON En la llamada a addOn El ejemplo siguiente muestra cómo enlazar el controlador de evento "btnOK_Click" (de la clase actual)
con el evento click de un botón btnOK.
Para la mayoría de los eventos, puede crear y pasar una instancia del delegado genéricoEventHandler,
que pasa un objetoEvent genérico.
Sin embargo, algunos eventos usan clases especiales de controlador de eventos al incluir información
adicional y específica de algunos eventos.
Por ejemplo, los eventos de movimiento del mouse (ratón) suelen incluir información como la ubicación
del cursor. Para obtener este tipo de información, se crea y pasa una instancia de la claseMouseEventHandler,
que pasa un objeto MouseEvent al controlador.
Los eventos de teclado requieren que KeyEventHandler obtenga información del estado de las teclas MAYÚS,
etc. (este controlador pasa un objeto KeyEvent).
Todas las clases delegadas de controlador de eventos WFC se derivan de com.ms.lang.Delegate.
Casi todas pertenecen al paquete com.ms.wfc.ui con nombres que acaban en EventHandler.
Todos los eventos WFC se derivan de com.ms.wfc.core.Event, tienen nombres que acaban en Event y pertenecen
al paquete com.ms.wfc.ui.
En el Diseñador de formularios puede utilizar la vista Eventos de la ventana Propiedades para enlazar un
evento a un método específico.
A continuación, el Diseñador crea el método addOn Cuando el delegado llama a su controlador, le pasa dos parámetros; el primero es una referencia al
objeto que originó el evento y el segundo es un objeto de evento que puede contener información acerca
de éste.
El aspecto que puede tener un controlador para el delegado del ejemplo anterior es el siguiente:
Clase EventHandler Si utilizó la clase EventHandler genérica para enlazar con el método, el objeto Event del controlador no contendrá ninguna información de interés. Pero si hay información adicional disponible del evento, puede extraerla del objeto de evento específico. A continuación, se muestra cómo podrían ser el delegado y el controlador de un evento de movimiento del mouse; el objeto MouseEvent expone propiedades que permiten obtener la posición del mouse.
Si desea controlar los eventos de varios controles o varios eventos para un mismo control, solicite
una notificación diferente para cada combinación control/evento.
Varias notificaciones pueden especificar el mismo controlador; por ejemplo, todos los botones de una
barra de herramientas pueden llamar al mismo controlador para su evento de clic.
También puede usar el objeto source pasado al controlador para obtener detalles acerca de en qué botón
se hizo clic. Normalmente, se asigna o enlaza el objeto pasado al controlador con la clase apropiada para
poder llamar métodos desde la clase correspondiente.
El ejemplo siguiente muestra código que define los botones de una barra de herramientas y requiere
notificación de sus eventos de clic, junto con el método utilizado para controlarlos.
Crear un control básico Esta sección proporciona una descripción general sobre la creación de un control guiándole a través del
proceso. Explica cómo definir un control básico y proporciona funcionalidad para los eventos base.
Definir un control Un control personalizado es una subclase de la clase Control WFC. Para conseguir que el control esté visible en el Cuadro de herramientas de Visual J++, puede ser necesario extender la clase com.ms.wfc.ui.Control.ClassInfo. La claseClassInfo contiene metadatos utilizados para proporcionar información en tiempo de diseño sobre una clase y para examinar propiedades y eventos de componentes en tiempo de ejecución. Si no es preciso que el control esté visible en el cuadro de herramientas, no es necesario extender com.ms.wfc.ui.Control.ClassInfo. No obstante, debe crear una subclase de Component.ClassInfo, que ejecuta com.ms.wfc.core.IClassInfo. Esta clase inferior debe denominarse ClassInfo.
Nota ElGenerador de componentes WFC crea un control esquemático, que incluye los métodos y las propiedades y puede rellenar. La información de esta sección incluye detalles sobre cómo se genera manualmente un control y explica lo que hace el generador.
A continuación, se muestra un control esquemático. Si lo compila, el control se registra en su PC y se hace disponible en el cuadro de diálogo Personalizar cuadro de herramientas:
Si agrega una instancia de este control a un formulario, verá sus propiedades y eventos en la ventana
Propiedades.
Puede cambiar estas propiedades y observará que el control admite backColor, foreColor, anchor, dock,
eventos de mouse (ratón), focus, etc.
La clase com.ms.wfc.ui.Control define la implementación predeterminada de estos eventos y propiedades
comunes.
Agregar una descripción a un control Puede incluir una descripción de texto para los controles expuestos como ActiveX. Las aplicaciones host
pueden así realizar consultas y mostrar la descripción. Para crear una descripción, agregue un objeto
DescriptionAttribute a la claseClassInfo.
El siguiente ejemplo muestra cómo agregar una descripción de texto:
Proporcionar funcionalidad para eventos Class
La clase com.ms.wfc.ui.Control expone un conjunto de miembros común con funcionalidad predeterminada.
Por ejemplo, si crea un control básico como se ha explicado anteriormente, una propiedad text estará
disponible para él en la ventana Propiedades.
Normalmente, para agregar funcionalidad a un control, se deben reemplazar los miembros de ese control
expuesto por la clase base.
La mayoría de los eventos en WFC se exponen en su clase base con un miembro En el código de reemplazo, defina la funcionalidad que desea para el evento. Generalmente,
debe implementar la funcionalidad predeterminada del miembro llamando al evento de superclase.
Si incluye una llamada al evento de superclase, puede especificar el orden en que se desencadenará
el evento.
Existen métodos adicionales para recibir eventos cuando no se está creando una subclase de un evento
definido en la superclase. Para obtener más información, vea Trabajar con eventos Control.
El siguiente ejemplo muestra cómo reemplazar el método protegidoonPaint para definir los elementos que
debe presentar en pantalla el control en tiempo de ejecución.
En el ejemplo, se llama primero al evento de superclase para ejecutar el propio método paint de la
superclase.
El propio código del control muestra el valor de la propiedad text llamando al métododrawString de un
objetoGraphics:
En este ejemplo, se presenta texto en pantalla llamando al método getText del control para recuperar
el texto almacenado en el control. Una vez que se compila y agrega la nueva versión de la clase, el
control contiene cualquier texto que haya escrito en la propiedad text.
Puesto que com.ms.wfc.ui.Control proporciona una propiedad text, no es preciso crear una nueva.
El parámetro para onPaint es un eventoPaintEvent, que contiene datos específicos del evento.
Si crea una superclase de un miembro protegido, el objeto que envía el evento se conoce implícitamente
porque el remitente es this (la instancia actual de la clase).
Los datos de evento varían de un evento a otro. En este caso, el evento PaintEvent tiene el siguiente
aspecto:
El miembro graphics del evento PaintEvent hace referencia a un objeto com.ms.wfc.ui.Graphics.
Este es el empaquetador WFC para una superficie de dibujo, un contexto de dispositivos Win32.
El objeto Graphics expone métodos para dibujar cadenas, líneas, puntos, elipses, etc.
Puede cambiar los valores de las propiedades font, foreColor y backColor, y se mostrarán correctamente
porque el objeto Graphics que se pasa a través del evento PaintEvent se configura con las fuentes y
pinceles correctos de acuerdo con los valores del control.
Button btnOK = new Button();
btnOk.addOnMouseClick( new EventHandler( this.btnOK_Click ));
private void btnOK_Click(Object source, Event e)
{
if (source instanceof Button)
{
String buttonName = ((Button)source).getText();
MessageBox.show("Hizo clic en el botón " + buttonName);
}
}
// Ésta es la solicitud de notificación
Button btnTest = new Button();
// Observe que el método addOn
private void initEventHandlers()
{
Button buttonNew = new Button();
Button buttonSave = new Button();
Button buttonExit = new Button();
// Todos los eventos son dirigidos al mismo controlador
buttonNew.addOnClick( new MouseEventHandler( this.toolbarClick) );
buttonSave.addOnClick( new MouseEventHandler( this.toolbarClick) );
buttonExit.addOnClick( new MouseEventHandler( this.toolbarClick) );
}
// Controlador de eventos común
private void toolbarClick( Object source, Event e)
{
String buttonName;
if (source instanceof Button)
{
buttonName = new String((Button)source).getText());
MessageBox.show("Ha hecho clic en el botón " + buttonName);
}
}
// MyControl.java
import com.ms.wfc.ui.*;
import com.ms.wfc.core.*;
public class MyControl extends Control
{
public static class ClassInfo extends Control.ClassInfo
{
}
}
public static class ClassInfo extends Control.ClassInfo
{
public void getAttributes(IAttributes attribs){
super.getAttributes(attribs);
attribs.add(new DescriptionAttribute("Esta es la descripción de MyControl"));
}
// MyControl.java
import com.ms.wfc.ui.*;
import com.ms.wfc.core.*;
public class MyControl extends Control
{
protected void onPaint(PaintEvent p)
{
super.onPaint(p);
Graphics g = p.graphics;
g.drawString(getText(), 0, 0);
}
public static class ClassInfo extends Control.ClassInfo
{
}
}
public class PaintEvent extends Event
{
// Objeto Graphics para realizar el dibujado.
public final Graphics graphics;
// Rectángulo en el que se debe realizar el dibujado.
public final Rectangle clipRect;
}