TOPICOS AVANZADOS DE PROGRAMACIÓN
INSTITUTO TECNOLÓGICO DE LÁZARO CÁRDENAS
JOSUE JONATHAN PEÑALOZA PIEDRA MATERIA: TOPICOS AVANZADOS DE PROGRAMACIÓN 4TO SEMESTRE PROFA: MARY SANDRA RODRIGUEZ CHAVEZ 19 DE MARZO DE 2012
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 1
TOPICOS AVANZADOS DE PROGRAMACIÓN
INDICE:
DEFINICIÓN CONCEPTUAL DE COMPONENTES, PAQUETES/LEBRERÍAS…………………3
USO DE COMPONENTES (VISUALES Y NO VISUALES) PROPORCIONADOS POR EL LENGUAJE……………………………………………………………………………………………….4
USO DE LIBRERIAS PROPORCIONADAS POR EL LENGUAJE………………………………11
CREACIÓN DE COMPONENTES (VISUALES Y NO VISUALES) DEFINIDOS POR EL USUARIO………………………………………………………………………………………………18
CREACIÓN Y USO DE PAQUETES/LIBRERÍAS DEFINIDAS POR EL USUARIO……………24
BIBLIOGRAFÍA…………………………………………………………………………………………32
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 2
TOPICOS AVANZADOS DE PROGRAMACIÓN DEFINICIÓN CONCEPTUAL DE COMPONENES, PAQUETES/LIBRERIAS
Componente: Es una clase abstracta que representa todo lo que tiene una posición, un tamaño, puede ser pintado en pantalla y puede recibir eventos. Los Objetos derivados de la clase Componente que se incluyen en el Abstract Windows Toolkit son los que aparecen a continuación:
Button
Canvas
Checkbox
Choice
Label
List
Scrollbar
Container
Panel
Windows o Dialog o Frame
TextComponent
TextArea
TextField
Un paquete en Java es lo que su nombre lo indica, un paquete o conjunto de clases, lógicamente, que tienen cosas en común. Lógicamente un programado puede agruparlas con o sin criterio, pero lo ideal es que se dediquen a funciones específicas. También los paquetes definen una jerarquía de directorios, que permiten igualmente agrupas las clases, cosa de desplegar los archivos mas ordenadamente.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 3
TOPICOS AVANZADOS DE PROGRAMACIÓN LIBRERÍAS La utilización de objetos dinámicos supone dejar pendiente en el montaje de la aplicación el enlace de dichos objetos. Cuando la aplicación está en ejecución, y sólo entonces, se produce el enlace (dinámico) con los objetos contenidos en la librería. La creación de librerías dinámicas corre a cargo del enlazador o montador (en nuestro caso el ld) aunque también es posible indicar al compilador las opciones necesarias para el montaje y de ese modo, será él quien se encargue de pasárselas al montador. Cuando se crea un objeto dinámico es necesario que dicho código objeto sea independiente de la posición, para conseguir este tipo de código debe especificarse al compilador la opción -fPIC (Position IndependentCode). Dicho flag debe indicarse tanto en la compilación como en el montaje de la librería. Para montar los objetos es necesario además indicar la opción -shared para que el resultado sea un fichero objeto ‘compartible’.
USO
DE
COMPONENTES
(VISUALES
Y
NO
VISUALES)
PROPORCIONADOS POR EL LENGUAJE.
Un componente desde el punto de vista de programación esta compuesto por varias secciones y el conjunto de todas ellas dan lugar a la creación de dichocomponente. Por tanto, primero para no perder el norte, vamos a empezar definiendo el convenio que es utilizado para organizar dichas secciones por TinyOs. En general, un componente
posee tres
grandes secciones
que son:
Configuration, Implementation, Module. Estas tres secciones han de estar obligatoriamente presentes en cualquiercomponente aunque puedan estar vacías. El estándar de T i n y O s determina, que las secciones de Configuration eImplementatión han de ir en un fichero que recibirá el nombre del componente con laextensión .nc y la tercera sección de Module deberá de ir en otro fichero aparte querecibirá el nombre del componente concatenado con un M
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 4
TOPICOS AVANZADOS DE PROGRAMACIÓN mayúscula (la M da elsignificado al fichero, es el significado de Module) , este último fichero también poseeráa extensión .nc. Otra buena costumbre consiste en crear un fichero de header o cabecera con extensión .h que contenga todas las enumeraciones, registros o tipos de datos creadospor el usuario de los que hace uso la aplicación, y cuando se realiza esto la forma deligar dicho fichero con los otros dos es utilizando al principio de los otros fichero ladirectiva includesheader; aunque como mención especial decir
que si
nos fijamosmejor en este directiva se puede ver que no se
incorpora la extensión .h en la misma. Ahora que ya sabes cuales son las secciones que va a contener cada ficherovamos a empezar a explicar cada una de ellas. ImplementatiónEsta sección se va a encargar de definir las conexiones que hay entre losdiferentes componentes que utiliza la aplicación, esto es debido a que si recordamos unpoco, se ha comentado que la programación de un componente (que se llevará a cabo en la sección de module) se hace utilizando interfaces y dichas interfaces para poderutilizarlas las ha de proporcionar un componente, entonces básicamente es esta secciónse definen cuales
son
los
componentes
que
proporcionan
las
interfaces
a
nuestraaplicación (por lo general serán componentes primitivos). Una vez que conocemos la finalidad de esta sección y llegados a este punto, vamos a insertar un concepto nuevo que es la diferencia que existe entre una aplicaciónque esta ya disponible para ser ejecutada en un sensor y un componente cualquiera. Ladiferencia es muy poca, y consiste en que una aplicación es un componente comocualquier cosa en este lenguaje que en su sección de implementación hace uso de uncomponente especial denominado Main. BOTONES Creación de botones como objetos. Se pueden crear objetos Button con el operador new como se muestra a continuación:
SINTAXIS: Buttonbotón; Botòn = new Button (“Baton");
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 5
TOPICOS AVANZADOS DE PROGRAMACIÓN
La cadena utilizada en la creación del botón aparecerá en el botón cuando se visualice en pantalla. Esta cadena también se devolverá para utilizarla como identificación del botón cuando ocurra un evento.
EVENTOS BUTTON Cada vez que el usuario pulsa un botón, se produce un evento. Los eventos de pulsación de un botón se pueden capturar sobrecargando el método action ():
SINTAXIS: public Boolean action (Event evt, Object obj) { if (evt.targetinstanceof Button) System.out.println( (String)obj ); else System.out.println( "Evento No-Button" ); }
La distinción entre todos los botones existentes se puede hacer utilizando el objeto destino, pasado por el objeto Event y comparándolo con los objetos botón que se colocaran en la interfaz.
BOTONES DE PULSACIÓN Los botones presentados en el applet son los botones de pulsación estándar; no obstante, para variar la representación en pantalla y para conseguir una interfaz más limpia, AWT ofrece a los programadores otros tipos de botones como los que se muestran a continuación:
BOTONES DE SELECCIÓN Los botones de selección se pueden agrupar para formar una interfaz de botón de radio (CheckboxGroup), que son agrupaciones de botones Checkbox en las que siempre hay un único botón activo.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 6
TOPICOS AVANZADOS DE PROGRAMACIÓN
BOTONES AUTOCONTENIDOS La naturaleza orientada a objetos de Java nos da la posibilidad de crear botones completamente auto contenido. En este tipo de botón, se construye el manejador de eventos dentro de la propia clase extendida de botón. Se pueden añadir estos botones a la aplicación, sin tener que preocuparse de los eventos que pudieran generar.
CANVAS Si tenemos un applet que trabaja con imágenes directamente, ya sea un applet gráfico o de dibujo, los lienzos o zonas de dibujo llamados Canvas resultan muy útiles.
Los Canvas son un Componente básico que captura eventos de exposición (expose). La clase base Canvas no responde a los eventos, sin embargo se puede crear una subclase que sea la encargada de manipular los eventos.
Al permitir saltarse el manejo normal de eventos, y junto con los métodos de representación gráfica, los Canvas simplifican la producción de applet que necesitan una única funcionalidad para distintas áreas.
BOTON DE MARCACION Los botones de marcación llamados Checkbox se utilizan frecuentemente como botones de estado. Proporcionan información del tipo Sí o No (true o false). El estado del botón se devuelve en el argumento Objeto de los eventos Checkbox; el argumento es de tipo booleano: verdadero (true) si la caja se ha seleccionado y falso (false).
Tanto el nombre como el estado se devuelven en el argumento del evento, aunque se pueden obtener a través de los métodos getLabel () y getState () del objeto Checkbox.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 7
TOPICOS AVANZADOS DE PROGRAMACIÓN BOTONES DE LISTA Los botones de selección en una lista son llamados Choice y estos permiten el rápido acceso a una lista que contenga una determinada cantidad de elementos.
CONTAINER
PANELES La clase Panel es el más simple de los Contenedores de Componentes gráficos. Se crea una clase no-abstracta Conteiner que sirva de base a los applet y a otras pequeñas aplicaciones. La clase Panel consta de dos métodos propios:
Constructor: cuyo fin es crear un nuevo Panel con un LayoutManager de tipo FlowLayout que es el de defecto.
Método addNotify () que, sobrecargando la función del mismo nombre en la clase Conteiner el cual llama al método createPanel () del Toolkit adecuado el cual, creando así un PanelPeer.
El AWT enviará así al Panel al applet y todos los eventos que sobre él ocurran. El uso de Paneles permite que las aplicaciones puedan utilizar múltiples layouts, es decir, que la disposición de los componentes sobre la ventana de visualización pueda modificarse con mucha flexibilidad. Permite que cada Contenedor pueda tener su propio esquema de fuentes de caracteres, color de fondo, zona de diálogo, etc.
VENTANAS Una Ventana genérica, Windows, puede utilizarse simplemente para que sea la clase padre de otras clases y se puede intercambiar por un Diálogo (Dialog) sin pérdida de funcionalidad.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 8
TOPICOS AVANZADOS DE PROGRAMACIÓN
MARCO DE UNA APLICACION El Contenedor de los Componentes es el Frame. También es la ventana principal de la aplicación, lo que hace que para cambiar el icono o el cursor de la aplicación no sea necesario crear métodos nativos; al ser la ventana un Frame, ya contiene el entorno básico para la funcionalidad de la ventana principal. Al crear un Frame, extiende la clase principal y hereda todas sus características. Tiene un método el constructor, que no admite parámetros. Además, se hace una llamada explícita al constructor utilizado es decir, al constructor de la clase padre, para pasarle como parámetro la cadena que figurará como el título de la ventana. La llamada a show() es necesaria, ya que por defecto, los contenedores del AWT se crean ocultos y hay que mostrarlos. La llamada a pack() hace que los componentes se ajusten a sus tamaños correctos en función del Contenedor en que se encuentren situados.
ETIQUETAS Las etiquetas llamadas Label proporcionan una forma de colocar texto estático en un panel, para mostrar información que no varía o que no puede ser modificada por el usuario.
LISTAS Las listas (List) aparecen en las interfaces de usuario para facilitarles la manipulación de muchos elementos. Se crean utilizando métodos similares a los de los botones Choice. La lista es visible todo el tiempo, utilizándose una barra de desplazamiento para visualizar los elementos que no caben en el área que aparece en la pantalla. Para acceder a los elementos seleccionados se utilizan los métodos getSelectedItem() o getSelectedItems(). Para listas de selección simple, cualquier selección con doble-click en la lista disparará el método action() de la misma forma que con los eventos de selección en menús.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 9
TOPICOS AVANZADOS DE PROGRAMACIÓN
BARRAS DE DESPLAZAMIENTO Es muy común que se utilicen en determinados applet que necesiten realizar el ajuste de valores lineales en pantalla, resulta útil el uso de barras de desplazamiento (Scrollbar). Las barras de desplazamiento proporcionan una forma de trabajar con rangos de valores o de áreas como el Componente TextArea, proporcionando las barras automáticamente.
Este tipo de interfaz proporciona al usuario un punto de referencia visual de un rango y al mismo tiempo la forma de cambiar los valores. Por ello, las barras de desplazamiento son Componentes un poco más complejos que los demás, reflejándose esta complejidad en sus constructores.
Al crearlos hay que
indicar:
Su orientación.
Su valor inicial.
Los valores mínimo y máximo que puede alcanzar.
Porcentaje de rango que estará visible.
Las barras de desplazamiento generan eventos; pero se debe utilizar el método handleEvent() directamente, en lugar del método action(). El destino del evento será un objeto de la clase Scrollbar, a partir de éste se obtiene la posición de la barra de desplazamiento.
SINTAXIS: JScrollPane scroll = new JScrollPane( tab, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
AREAS DE TEXTO Java a través del AWT, permite incorporar texto multilínea dentro de zonas de texto (TextArea). Los objetos TextArea se utilizan para elementos de texto que JOSUE JONATHAN PEÑALOZA PIEDRA
Página 10
TOPICOS AVANZADOS DE PROGRAMACIÓN ocupan más de una línea, como puede ser la presentación tanto de texto editable como de sólo lectura, para las áreas de texto hay que especificar el número de columnas. Se puede permitir que el usuario edite el texto con el método setEditable(). Para acceder al texto actual de una zona de texto se utiliza el método getText(), las áreas de texto no generan eventos por sí solas, por lo que hay que utilizar eventos externos, para saber cuando tenemos que acceder a la información contenida en el TextArea.
CAMPOS DE TEXTO Para la entrada directa de datos se suelen utilizar los campos de texto, que aparecen en pantalla como pequeñas cajas que permiten al usuario la entrada por teclado. Los campos de texto o TextField se pueden crear vacíos con una longitud determinada, rellenos con texto predefinido.
USO DE LIBRERÍAS PROPORCIONADAS POR EL LENGUAJE Java es un lenguaje de programación desarrollado para una multitud de plataformas y procesadores. Consideremos los dos tipos de aplicaciones gráficas más comunes. Modelos de Frames y Applets, se pueden construir usando cualquiera de las dos galerías de componentes visuales, son: JAVA AWT: Es la librería visual más antigua de java usando esta librería, se podrán construir los tres tipos de programas mas comunes como son FRAME, WINDOW y APPLET. JAVA SWING: Es la librería de componentes visuales más nueva que proporciona java, usando esta librería se podrán construir los tres tipos de programas o aplicaciones que son JFRAME, WINDOW Y JAPPLET. Un applet es un programa en java que se mandan a una máquina o PC remota para que los ejecuten o lo corra, cuando este applet de llegada a las máquinas remotas vía browser, dicho browser es quien activa la máquina virtual de java que da la orden de compilación y ejecución, es decir java programa.applet. Entonces es importante que la máquina virtual de java, que se encuentra en la PC remota,tenga capacidad de incluir todas las librerías de java, como la de match, la de AWT, la de lang.etc. JOSUE JONATHAN PEÑALOZA PIEDRA
Página 11
TOPICOS AVANZADOS DE PROGRAMACIÓN Existen diferentes librerías en java, entre las cuales se encuentra.
Java. lang
Colección de tipo básico siempre importados a cualquier unidad de compilación. Aquí están las declaraciones de objetos, clases, wrappers.
Interfaces Clases. Cloneables Boolean Comparable Byte Runnable Character ClassLoader Compiler Double Float InheritableThreadLocal Interger Long Math Number Object System Thread VoidString, etc...
Java.io Archivos de stream y acceso aleatorio. Librería estándar de entrada y salida. Interfaces Clases DataInputBufferedInputStream DataOutputBufferedOutputStream ExternalizableBufferedReader FilefilterBufferedwrite FilenameFilterByteArrayInputStream OdjectInputByteArrayOutputStream SerializableDataOutputStream File InputStream reader Writer,etc.. JOSUE JONATHAN PEÑALOZA PIEDRA
Página 12
TOPICOS AVANZADOS DE PROGRAMACIÓN Java.net Librería que apoya interfaces con telnet y URL.
Interfaces Clases, ContentHandlerFactory Authenticator, DatagramSocketImplFactoryContentHandler, FileNameMapDatagramPacket, SocketOptionsDatagramSocketImpl, URLStreamHanlerFactoryHttpURKConnection, URL, etc..
Java.util Clase como de diccionarios, tabla de hash, stack, técnica de codificación hora, fecha, etc.
Interfaces Clases Collection AdstractCollection. Comparator AdstracList., Enumeration AdstrectMap. EventListenerAdstrectSecquentialList. InteratorAdstractSe.t List ArreyList Observer Collection SortedSetEventObject Random Stack Timer Vector Date,etc.
Java.Awt AbstractWindowingToolkit que proporciona una capa abstracta que permita llevar una aplicación en java de un sistema de ventanas a otro. Contiene clases para componentes básicos de la interfaz, tales como eventos, colores, tipos de letra, botones, campos de texto.
Estructura del awt. La estructura de la versión actual del AWT en la plataforma Java 2 se puede resumir en los puntos siguientes: JOSUE JONATHAN PEÑALOZA PIEDRA
Página 13
TOPICOS AVANZADOS DE PROGRAMACIÓN Los contenedores contienen componentes, que son los controládores básicos. No se usan posiciones fijas de los componentes, si no estan situados a traves de una disposición controlado (layouts) El común denominador de mas bajo nivel se acerca al teclado, ratón y manejo de eventos. Alto nivel de abstracción respecto al entorno de ventanas en que se ejecute la aplicación (no hay áreas clientes, ni llamadas a X ). La arquitectura de la aplicación es dependiente del entorno de ventanas, en vez de tener un tamaño fijo. Carece de un formato de recursos. No se puede separar el código de lo que es propiamente interfaz. No hay ningún diseñador de interfaz toda vía. Interfaces Clases ActiveEventAlphaComposite AdjustableAWTEvent
Java.applet El paquete java.applet permite la creación de appletsatraves de la clase Applet, proporciona interfaces para conectar un applet a un documento web y para audición de audio. Interfaces Clases AppletContext Applet AppletStub AudiClip
Java.math Proporciona cálculos en entero grande y real grande. Clases Bigdecimal Biginteger Además de la clase Math.
Esta es la clase que representa la librería matemática de Java. Las funciones que contiene son las de todos los lenguajes, parece que se han metido en una clase solamente a propósito de agrupación, por eso se encapsulan en Math, y lo mismo sucede con las demás clases que corresponde a objetos que tiene un tipo equivalente (carácter, Float, etc.) La clase Math es public para que se pueda llamar desde cualquier sitio y static para que no haya que iniciarla.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 14
TOPICOS AVANZADOS DE PROGRAMACIÓN Java.rmi Este paquete hace posible que un objeto se ejecute en una maquina virtual Java invoque métodos de otro objeto que se ejecuta en la máquina virtual distinta; dicha máquina virtual pueden encontrarse en ordenadores diferentes conectados a través de una red TCP/IP.
Interfaces Clases RmoteMarshalledObject Naming RMISecurityManager
Java.text Contiene clase que permiten dar formato especializado a fechas, números y mensajes. Interfaces Clases AttributedChacterIterator Annotation CharacterIteratorAttibutedCharacterIterator ChoceFormat DateFormat Format MessageFormat NumberFormat ParsePosition
Java.sound.midi Paquete con clase e interfaces que permitan la captura, procesamiento y reproducción de música MIDI. Interfaces Clases ControllerEventListener Instrument MataEventListenerMeteMessage MidiChannel MidiDevice.info MidiDeviceMidiEvent Receiver MidiFileFormat SequecerMidemessage
JAVA .SQL Junto con el paquete javax.sql, incluido en java 2 SDK Edición para la empresa, forma parte del API de java 2.0 (conexión Java a Base de Datos), y permite la JOSUE JONATHAN PEÑALOZA PIEDRA
Página 15
TOPICOS AVANZADOS DE PROGRAMACIÓN conexión de base de datos, el envió de sentencias SQL y la interpretación de los resultados de las consultas.
IntefacesClases Array Date Blob DriverManager CallabeStatementDriverPropertyInfo ClobSQLPermission Connecction Timer DatabaseMetaDate Timestamp Driver Type Ref SQLData SQLInput SQLOutput Struct
JAVA.SWING Paquete que mejora e AWT, proporcionando un conjunto de componentes que se ejecutan de manera uniforme en todas las plataformas. Interfaces Clases Action AbstractAction ComboBoxEditorActonMap Icon Box.Filler ListModelCellRendererPane MenuElementDebugGraphics WindowsConstantsDefaulListSelectionModel JApplet Jbutton JCheckBox JFrameJMenu JLabel JPanel JTextField JTree JWindows Temer UIManager, etc..
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 16
TOPICOS AVANZADOS DE PROGRAMACIÓN EJEMPLOS DONDE PODEMOS NOTAR EL USO DE LAS LIBRERÍAS. importjava.awt.*; importjava.awt.event.*; importjavax.swing.*; public class AparienciaVisual extends JFrame { private final String cadenas[] = { "Metal", "Motif", "Windows" }; privateUIManager.LookAndFeelInfoapariencias[]; privateJRadioButtonopción[]; privateButtonGroupgrupo; privateJButtonbotón; privateJLabeletiqueta; privateJComboBoxcuadroCombinado; String s1=""; publicAparienciaVisual() { super( "apariencia visual" ); Container contenedor = getContentPane(); // establecer panel para región NORTH de esquema BorderLayout JPanelpanelNorte = new JPanel(); panelNorte.setLayout( new GridLayout( 3, 1, 0, 5 ) ); // estableceretiquetapara panel NORTH etiqueta = new JLabel( "Ésta es la apariencia visual Metal seleccionada",
// CREA UN ARCHIVO DE ACCESO ALEATORIO, ESCRIBIENDO 100 REGISTROS VACÍOS EN EL DISCO. import java.io.*; importjavax.swing.*; public class CrearArchivoAleatorio { private static final int NUMERO_REGISTROS = 100; // permitir al usuario seleccionar el archivo a abrir privatevoidcrearArchivo() { // mostrar cuadro de diálogo para que el usuario pueda seleccionar el archivo JFileChooserselectorArchivo = new JFileChooser(); selectorArchivo.setFileSelectionMode(JFileChooser.FILES_ONLY ); int resultado = selectorArchivo.showSaveDialog( null ); // si el usuario hizo clic en el botón Cancelar del cuadro de diálogo, regresar if ( resultado == JFileChooser.CANCEL_OPTION ) JOSUE JONATHAN PEÑALOZA PIEDRA
Página 17
TOPICOS AVANZADOS DE PROGRAMACIÓN return; // obtener el archivo seleccionado File nombreArchivo = selectorArchivo.getSelectedFile(); // mostrar error si el nombre del archivo es inválido if ( nombreArchivo == null || nombreArchivo.getName().equals( "" ) )
CREACION DE COMPONENTES (VISUALES Y NO VISUALES) DEFINIDOS POR EL USUARIO. Se puede establecer muchas clasificaciones para los componentes. Una de ellas es la de visuales o controles, frente a no visuales. Un componente es visual cuando tiene una representación gráfica en tiempo de diseño y ejecución (botones, barras de scroll, cuadros de edición, etc.), y se dice no visual en caso contrario (temporizadores, cuadros de diálogo-no visibles en la fase de diseño, etc). Por lo demás no existen más diferencias entre ellos, excepto, claro está, las derivadas de la visualización del componente. Los componentes no visuales se pueden colocar en los formularios de la misma manera que los controles, aunque en este caso su posición es irrelevante. Para empezar, los componentes visuales podemos dividirlos a su vez en dos tipos: -Componentes interactivos: permiten que el usuario final los manipule, ya sea introduciendo datos, seleccionado elementos, etc. De forma que estos componentes pueden recibir el foco (con SetFocus) así como los eventos propios del teclado y del ratón. Normalmente, el propio sistema operativo es el encargado de dibujar el aspecto del componente, haciendo el componente las llamadas correspondientes para que este aspecto cambie. -Componente gráficos: el propio componente es el encargado de dibujar en la pantalla lo que crea oportuno, bien a través de las funciones básicas del API de Windows (con el objeto TCanvas) o bien a través de otras librerías gráficas, como OpenGL, DirectX, etc. Estos componentes, no suelen recibir eventos del usuario final, aunque si eventos del propio programador, ya que su cometido no suele ir más allá de mostrar ciertos gráficos o imágenes en la pantalla. Si tuviéramos que crear un componente interactivo desde el principio, sería demasiado complejo, ya que tendríamos que luchar encontrar el propio API del sistema operativo, gestionando sus mensajes, las llamadas las funciones a bajo nivel, etc. Sin embargo, podemos aprovechar la mayoría del trabajo hecho por Borland en la VCL, y crear componentes interactivos a partir de otros ya existentes, aplicado la técnica de herencia.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 18
TOPICOS AVANZADOS DE PROGRAMACIÓN Dado que un componente es un objeto como otro cualquiera, podremos aplicar en el todas las técnicas de la orientación a objetos: encapsulación, herencia y polimorfismo. La encapsulación ya la hemos utilizado sin apenas darnos cuenta, simplemente definiendo ciertos atributos como privados, para que no puedan ser accedidos desde fuera de la clase, y otros públicos o publicados (pulished) para ser usados por el programador que utilice el componente. La herencia nos permite reutilizar código, haciendo que una clase dada (que llamaremos clase hija) adquirida a todos los atributos y métodos públicos y protegidos de otra, llamada clase padre. De este método, podemos aprovechar mucho código escrito, simplemente heredando de una clase ya escrita. Por si fuera poco, también es posible que una clase hijo tenga a su vez mas descendencia, adquiriendo estos las características del padre y del "padre del padre", es decir: del abuelo. La técnica de la herencia, aplicada a los componentes, nos permite personalizar cualquier componente, o porque queremos ampliar las posibilidades del componente. La propia VCL utiliza la herencia continuamente, bien para utilizar código de clases padre, o bien para ofrecernos clases padre de las que nosotros podemos heredar. Muchas "suites de componentes" hacen también esto, proporcionando un componente heredando a partir de cada uno de los básicos, y añadiendo en estas nuevas características. Para explicar cómo crear un componente interactivo, vamos a hacerlo a través de un ejemplo práctico: supongamos que necesitamos mostrar un árbol que muestre los directorios a partir de una carpeta dada, incluso pongamos que necesitamos mostrar el típico árbol de "MI PC", mostrando todas las unidades y las carpetas de cada una. Para ello, podríamos escribir un componente desde cero, gestionando todo lo referente a la estructura en árbol, el dibujo en pantalla, la gestión de mensajes,etc. Podríamos utilizar la herencia para utilizar el código ya escrito, concretamente basándose en el componente ATTreeVienw, que es el que nos permite mostrar en un formulario estructuras del tipo árbol. Sin embargo, el TTreeVienw que viene por defecto en el Delphi, es muy genérico, y sirve para mostrar cualquier ripo de árbol. Nuestro caso es mas específico: necesitamos mostrar un árbol, sí, pero más concretamente un árbol de directorios. Llamaremos a nuestra nueva creación TArbolDirectorios. Sólo vamos a fijarnos a partir TComponent: TComponent: este nos resulta familiar, ya que es la clase a partir de la que hemos creado en nuestro conversor de monedas de anteriores números. Los JOSUE JONATHAN PEÑALOZA PIEDRA
Página 19
TOPICOS AVANZADOS DE PROGRAMACIÓN componentes no-visuales deben heredar directamente de TComponent, ya que este proporciona las características básicas. TControl: se trata de la clase padre para todos los componentes visuales, ya sean gráficos o no. TWinControl: de esta clase descenderán todos los componentes dibujados directamente por Windows. La principal característica de estos objetos (llamados ventanas o Windows) es que están identificados por un número único llamado descriptor o manejador de ventana (en inglés handle). TCustomTreeView: se trata de la clase que permite mostrar un árbol dentro de un formulario de Delphi. La peculiaridad es que esta clase no contiene ningún método ni propiedad en la sección published, por lo que puedes ser manejada desde el entorno de Delphi. TTreeView: esta ya es la clase o componente final, que aparece registrado en la paleta de componentes, y que puede ser configurado en tiempo de diseño. En realidad, todo el trabajo de esta clase se limita a publicar las propiedades y eventos que han sido programados en la clase TCustomTreeVienw. Ahora que ya sabemos quíen va a ser el padre de nuestro componente, tenemos que decir qué propiedades y eventos vamos a proporcionar a nuestros usuarios del componente. CarpetaRaiz: se trata de una cadena que contendrá la carpeta a partir de que se creará el árbol de directorios. Puede ser la carpeta raíz de una unidad de disco(p.e."C:\") para mostrar los directorios de toda la unidad, o bien una carpeta cualquiera, para mostrar las subcarpetas de esta. Un caso se dará cuando esta propiedad contenga el valor "Mi PC", con en el que mostraremos cada una de las unidades disponibles en nuestro sistemas, pudiendo expandir estas unidades para mostrar sus carpetas. CarpetaActual: es el valor de tipo cadena que contiene la ruta de la carpeta seleccionada en el árbol, por ejemplo. Si, por ejemplo, tenemos seleccionada la carpeta de primer nivel "Datos", y el nodo raíz es "C:\Temporal", esta propiedad contendrá el valor "C:\Temporal\Datos". También se puede modificar su valor, seleccionándose en ese caso el modo correspondiente en el árbol (si el valor establecido es correcto). MostarPadre: es un valor booleano (true o false) que nos permite configurar la aparición no del nodo padre. Es decir: si en la propiedad "CarpetaRaiz" hemos introducido el valor "C:\Delphi", en el árbol aparecerá un nodo raíz llamado "Delphi", y colgado de él, todas las demás subcarpetas. Si establecemos esta propiedad a falso, el nodo raíz desaparecerá, mostrándose todas las subcarpetas en un primer nivel, sin colgar de ningún nodo padre. Una interfaz grafica está construida en base a elementos gráficos básicos, los componentes. Típicos ejemplos de estos componentes son los botones, barras de desplazamientos, etiquetas, listas, cajas de selección o campos de textos. Los componentes permiten al usuario a interactuar con la aplicación y proporcionar información desde el programa al usuario sobre el estado del JOSUE JONATHAN PEÑALOZA PIEDRA
Página 20
TOPICOS AVANZADOS DE PROGRAMACIÓN programa. En el AWT, todos los componentes de la interfaz de usuario son instancias de la clase componente o uno de sus subtipos. Los componentes no se encuentran aislados, si no agrupados dentros de contenedores. Los contenedores contienen y organizan la situación de los componentes y como tales pueden ser situados dentro de otros contenedores. También contienen el código necesario para el control de eventos, cambiar la forma del cursor o modificar el icono de la aplicación. En el AWT todos los contenedores son instancias de la clase Container o uno de sus subtipos. La clase componente es una clase abstracta que representa todo lo que tiene una posición, un tamaño, puede ser pintado en pantalla y puede recibir eventos. No tiene constructores públicos, ni puede ser instanciada. Sin embargo, la clase Component puede ser extendida para proporcionar una nueva característica incorporada a java, conocida como componentes ligeros o Lightweight. Los objetos derivados de la clase Component que se incluyen en el abstractwindowToolkit son los que aparecen a continuación: Button Canvas Checkbox Choice Container Panel Window Dialog Frame
Label List Scrollbar TextComponent TextArea TextField
Sobre estos componentes se podrán hacer más agrupaciones y quizá la más significativa fuese la que diferencie a los componentes según el tipo de entrada. A si habría componentes con entrada de tipo no-textual como los botones de pulsación (Button), las listas (List), botones de marcación (checkbox), botones de seleccion (Choice), y botones de comprobación (CheckboxGroup); componentes de entrada y salida textual como los campos de texto (TextField), las áreas de texto (TextArea) y las etiquetas (Label); y, otros componentes sin acomodo fijo en ningún lado, en donde se encontrarían componentes como las barras de desplazamiento(Scrollbar), zonas de dibujo (Canvas) e incluso los contenedores (Panel, Window, Dialog y Frame), que también pueden considerarse como componentes. La clase Button es aquella que produce un componente de tipo boton con un titulo.El constructor mas utilizado es el que permite pasarle como parametrouna JOSUE JONATHAN PEÑALOZA PIEDRA
Página 21
TOPICOS AVANZADOS DE PROGRAMACIÓN cadena, que será la que aparezca como titulo e identificador del botón en la interfaz de usuario. Botones de selección Los botones de selección (Choice) permiten el rápido acceso a una lista de elementos, presentándose como titulo en el item que se encuentre seleccionado. La clase choice extiende la clase component e implementa la interfaz ItemSelectable, que es aquella que mantiene un conjunto de items en los que puede haber, o no, alguno seleccionado. Botones de comprobación La clase CheckBox extiende la clase Componet e implementa la interfaz ItemSelectable, que es aquella que contiene un conjunto de ítems entre los que puede haber o no alguna seleccionado. Los botones de comprobación (Checkbox) se puede agrupar para formar una interfaz de botón de radio (CheckboxGroup),que son agrupaciones de botones de comprobación de exclusión múltiple es decir, en la que siempre hay un único botón activo. PROGRAMA: importjava.awt.*; importjava.awt.event.*; importjava.util.*; public class Java1403{ public static void main( String args[] ){ //Se instancia un objeto Interfaz Hombre-Máquina IHM ihm = new IHM(); } } // Clase de la Interfaz gráfica Class IHM { // Constructor de la clase public IHM() { // Se creaunobjetoCheckboxGroup CheckboxGroupmiCheckboxGroup = new CheckboxGroup(); //Ahora se crea un objeto Button y se registra un objeto //ActionListenersobreél Button miBoton = new Button( "Aceptar" ); miBotton.addActionListener( newMiActionListener ( miCheckboxGroup ) ); JOSUE JONATHAN PEÑALOZA PIEDRA
Página 22
TOPICOS AVANZADOS DE PROGRAMACIÓN // Se crea un objeto Frame para contener los objetos Checkbox y el // objetoButton. Se fija un Flowlayout, se incorporan a él los // objetos, se fija el tamaño y se hace visible Frame miFrame = new Frame ( " Tutorial de Java, AWT " ); miFrame.setLayout( new FlowLayout() ); miFrame.add( new Checkbox( "A", true,miCheckboxGroup ) ); miFrame.add( new Checkbox( "B", false,miCheckboxGroup ) ); miFrame.add( new Checkbox( "C", false,miCheckboxGroup ) ); miFrame.add( new Checkbox( "D", false,miCheckboxGroup ) ); miFrame.add(miBoton ); miFrame.setSize( 250,100 ); miFrame.setVisible( true ); //Instanciamos y registramos un receptor para terminar la //ejecución de la aplicación, cuando el usuario cierre la //ventana miFrame.addWindowListener( new Conclusion() ); } } // Esta clase indica la caja de selección que esta seleccionada // cuando se pulsa el botón de Aceptar classMiActionListener implements ActionListener { CheckboxGroupoCheckBoxGroup; MiActionListener(CheckboxGroupcheckBGroup ) { oCheckBoxGroup = checkBGroup; } public void actionPerformed( ActionEventevt ) { System .out.println(oCheckBoxGroup.getSelectedCheckbox().getName()+ " " + oCheckBoxGroup.getSelectedCheckBox().getLabel () ); } } //Concluye la aplicación cuando el usuario cierra la ventana class Conclusion extends WindowAdapter { public void windowClosing( WindowEventevt ) { System.exit( 0 ); } }
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 23
TOPICOS AVANZADOS DE PROGRAMACIÓN CREACIÓN Y USO DE PAQUETES/LIBRERIAS DEFINIDAS POR EL USUARIO
Los paquetes son grupos de clases relacionadas; ayudan a organizar su código y proporcionan otra capa encapsulamiento. En programación, los paquetes, con frecuencia son útiles para agrupar las piezas relacionadas de un programa. Un paquete sirve para dos propósitos: primero, suministra un mecanismo por el cual piezas relacionadas de un programa pueden ser organizadas como una unidad. Se debe tener acceso a las clases definidas dentro de un paquete a través de su nombre de paquete. Así, un paquete proporciona la manera de nombrar una colección de clases. Segundo, un paquete participa en los mecanismos de control de acceso en java. Las clases definidas dentro de un paquete pueden hacerse privadas a ese paquete y no accesibles por código fuera del paquete. De este modo, el paquete suministra un medio por el cual las clases pueden ser encapsuladas.
DEFINIR UN PAQUETE:
Todas las clases en Java pertenecen a algún paquete. Como se mencionó anteriormente, cuando no se especifica la declaración
package se usa el
paquete predeterminado (o global). Además, el paquete predeterminado no tiene nombre, lo que lo hace transparente. Aunque el paquete predeterminado es válido para programas de prueba cortos, es inadecuado para aplicaciones reales.
Para crear un paquete, coloque un comando package en la parte superior del archivo fuente de java. Las clases declaradas dentro de ese archivo pertenecerán al paquete especificado. Puesto que un paquete define un espacio de nombre, los nombres de las clases que coloque dentro del archivo se convierten en parte de ese espacio del nombre del paquete.
La siguiente es la forma general de la declaración package: JOSUE JONATHAN PEÑALOZA PIEDRA
Página 24
TOPICOS AVANZADOS DE PROGRAMACIÓN packagepkg; Aquí, pkg es el nombre del paquete. Por ejemplo, el siguiente enunciado crea un paquete de nombre Project1.
package Project1;
Java usa el sistema de archivo para manejar los paquetes con cada paquete almacenado en su propio directorio. Por ejemplo, los archivos .class para las clases que usted declare sean partes de Project1 debe guardarse en un directorio llamado Project1.
Puede crear una jerarquía de paquetes. Para hacerlo, simplemente, separe cada nombre de paquete del inmediatamente anterior, por medio de un punto. A continuación, la forma general de una declaración de paquete multinivel:
package pack1.pack2.pack3....packN;
Por supuesto, debe crear directorios que soporten la jerarquía del paquete que crea. Por ejemplo:
paquetex.y.z;
Debe almacenarse en ...../X/Y/Z, donde ... especifica la ruta a los directorios específicos.
ENCONTRAR PAQUETES Y CLASSPATH:
Como se explicó, los paquetes son reflejados por los directorios. Esto provoca una pregunta importante: ¿Cómo sabe el sistema en tiempo de ejecución de java dónde buscar los paquetes que usted creó? La respuesta tiene dos partes. Primero, por defecto: el sistema de tiempo de ejecución de java busca en el directorio un curso como su punto de partida. Así, si sus archivos de clase están en el directorio actual, o en un subdirectorio del directorio actual, ellos se
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 25
TOPICOS AVANZADOS DE PROGRAMACIÓN encontrarán. Segundo, puede especificar una ruta o rutas de directorios colocando la variable ambiental CLASSPATH. Por ejemplo considere la siguiente especificación de paquete:
packageMyPack;
Para que un programa encuentre MyPack, una de estas opciones debe ser cierta: el programa es ejecutado desde un directorio inmediatamente anterior a MyPack, o CLASSPATH debe crearse para incluir la ruta a MyPack. La primera alternativa es la mas fácil (y no requiere un cambio a CLASSPATH), pero la segunda le permite a su programa encontrar MyPack sin importar en cual directorio esta el programa.
UN EJEMPLO BREVE DE UN PAQUETE:
Teniendo en cuenta la discusión anterior pruebe este ejemplo breve de paquete. Éste crea una base de datos simple de libro que esta contenido dentro del paquete BookPack.
//Demostración del uso de un paquete packageBookPack; class Book{ private String title; private String author; privateintpubDate; Book (String t, String a, int d){ title= t; author= a; pubDate= d; } void show( ) { System.out.println (title); System.out.println (author); System.out.println (pubDate); JOSUE JONATHAN PEÑALOZA PIEDRA
Página 26
TOPICOS AVANZADOS DE PROGRAMACIÓN System.out.println ( ); } }
classBookDemo { public static void main ( String args[ ] ){ Book book [ ] = new Book [5]; book[0] = new Book ("java Beginner´s Guide", "Schildt", 2001); book[1] = new Book ("java 2 programer´s Reference", "Schildt", 2000); book[2] = new Book ("HTML Programer´s Reference", "Powell and Whitworth", 1998); book[3] = new Book ("Red Storm Rising", "Clancy", 1986); book[4] = new Book ("On the Road", "Kerouac", 1955); for (int i=0; i
Llame este archivo BookDemo.java y colóquelo en un directorio de nombre BookPack. Luego, compile el programa. Asegúrese de que el archivo resultante .class esté también en el directorio BookPack. Luego trate de ejecutar la clase, usando la siguiente linea de comando:
javaBookPack. BookDemo
Recuerde, necesitará estar en el directorio anterior de BookPack cuando ejecute este comando o hacer que su variable ambiental CLASSPATH, este configurada apropiadamente. Como se dijo, BookDemo y Book ahora son parte del paquete BookPack. Esto quiere decir que BookDemo no puede ser ejecutado por sí mismo. Es decir, usted no puede usar esta línea de comando.
javaBookDemo
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 27
TOPICOS AVANZADOS DE PROGRAMACIÓN En cambio, BookDemo debe calificar con su nombre de paquete.
PAQUETES Y ACCESO A MIEMBROS
La visibilidad de un elemento está determinada por su especificación de accesos, private, public. protected o por defecto, y el paquete en el que éste resida.De este modo, la visibilidad de un elemento está determinada por su visibilidad dentro de la clase y su visibilidad dentro del paquete. Si un miembro de una clase no tiene especificador de acceso explícito, entonces éste sería visible desde dentro de su paquete pero no por fuera de él. Por esto debe usar como la especificación de acceso por defecto para los elementos que quiera mantener como privados en un paquete, pero |público| dentro de ese paquete. Los miembros declarados public explícitamente son visibles en todas partes, incluidas en clases y paquetes diferentes. No hay restricción en su uso o acceso.
La siguiente tabla resume los variados niveles de acceso a miembros.
Un miembro private es accesible sólo para otro miembro de su clase y no es afectado por su afiliación a un paquete. Un miembro especificado como protected es accesible dentro de su paquete y a todas las subclases. incluidos. subclases en otros paquetes. Una clase tiene sólo dos posibles niveles de acceso : por defecto y público. Cuando una clase se declare como prublic, ésta es accesible por cualquier otro código. Si una clase tiene acceso por defecto, puede tener acceso a ella sólo
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 28
TOPICOS AVANZADOS DE PROGRAMACIÓN por otro código dentro de su mismo paquete. También, una clse que se declare public debe residir en un archivo del mismo nombre.
IMPORTAR PAQUETES:
Cuando use una clase de otro paquete, puede calificar completamente el nombre de la clase cuete.on el nombre de su paquete. Sin embargo, tal aproximación puede fácilmente llegar a ser aburrida y complicada, si las clases que está calificando son profundamente anidadas en la jerarquía del paquete. Usando import puede traer uno o más miembros de un paquete a la vista. Esto le permite usar directamente aquellos miembros, sin hacer explícita las calificaciones del paquete. A continuación, la forma general de la declaración import:
importpkg.nombre de clase;
Donde pkg es el nombre del paquete, que puede incluir su ruta (path) completa y nombre de clase
el de la clase importada. Si desea importar todo el
contenido de un paquete, use un asterisco (*) para el nombre de clase. A continuación, ejemplos de las dos formas:
importMyPack.MyClass importMyPack.*;
En el primer caso, la clase MyClass es importada de MyPack. En el segundo,todas las clases en MyPack son importadas. En un archivo fuente de java, las declaraciones import ocurren en seguida de la declaración package (si existe) y antes de cualquier definición de clase. Usted puede usar import para traer el paquete BookPack a la vista, de modo que la clase Book pueda usarse sin calificación. Para hacer esto, sólo adicione la declaración import sobre cualquier archivo que use Book.
importBookPack,*; JOSUE JONATHAN PEÑALOZA PIEDRA
Página 29
TOPICOS AVANZADOS DE PROGRAMACIÓN
Por ejemplo, a continuación está la clase UseBook recodificada para usar import
//muestra la senctenciaimport packageBookPack; importBookPack;
//usodel book desdeBookPack classUseBook { public static void main ( String args []) {
Book book [] =new Book [5]; book[0] = new Book ("Java Beginners Guide", "Schildt", 2001); book[1] = new Book ("Java 2 programmer Reference", "Schildt", 2000); book[2] = new Book ("HTML Programmer Reference", "Pawell and Whitworth", 1998); book[3] = new Book ("Red Storm Rising ", "Clancy", 1986); book[4] = new Book ("On the Road", "Kerouac", 1955); for (int i=0; i
LA LIBRERIA DE CLASE JAVA ESTA CONTENIDA EN PAQUETES:
Esta libreria de clase con frecuencia se refiere a la Interfaz de Programación de Aplicaciones de java (Java API, ApplicationProgramming Interface). La Java API se almacena en paquetes. En la parte superior de la jerarquía del paquete está java. Descendiendo desde java hay varios subpaquetes, incluidos estos:
java.lang: contiene un gran número de clases de propósito general java.io:
contiene las clases de E/S
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 30
TOPICOS AVANZADOS DE PROGRAMACIÓN java.net: contiene aquellas clases que soportan redes java.applet: contiene clases para crear applets java.awt:
contiene clases que soportan las herramientas abstractas para
trabajar con ventanas de java
El paquete java.lang es único porque es importado automáticamente dentro de cada programa java.
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 31
TOPICOS AVANZADOS DE PROGRAMACIÓN
BIBLIOGRAFÍA: http://itslmg.wordpress.com/category/unidad-ii-creacion-de-componentes-y-libreriasdinamicas/
http://topicos-selectosdeprogramacion-itiz.blogspot.mx/p/creacion-de-componentes.html
http://www.mitecnologico.com/Main/DefinicionCreacionPaquetesLibreria
http://progitca.blogspot.mx/2012/03/instituto-tecnologico-de-cerroazul.html
http://msdn.microsoft.com/es-es/library/9a81d32x(v=vs.80).aspx
http://progitca.blogspot.mx/2012/03/cerro-azul-ver-instituto-tecnologico-de.html
http://progitca.blogspot.mx/2012/03/35-creacion-y-uso-de-paqueteslibrerias.html
JOSUE JONATHAN PEÑALOZA PIEDRA
Página 32