Вы находитесь на странице: 1из 174

Autor: Mg. Ing.

Javier Martnez Carrin

UNIVERSIDAD SAN PEDRO

FACULTAD DE INGENIERIA ESCUELA PROFESIONAL DE INGENIERIA INFORMTICA Y DE SISTEMAS

CURSO : CICLO :

FUNDAMENTOS DE PROGRAMACIN II 2009-I : Mg. Ing. MARTINEZ CARRIN JAVIER

SEMESTRE: DOCENTE

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 1

Autor: Mg. Ing. Javier Martnez Carrin

Chimbote, Abril 01 del 2009


INDICE GENERAL
Captulo I: 1.Programacin Orientada a Objetos 4 1.1 Origen 4 1.2. Diferencias con la Programacin Estructurada 6 2. Caractersticas de la Programacin Orientada a Objetos 2.1 Abstraccin 6 2.2 Encapsulamiento 7 2.3 Principio de Ocultamiento 7 2.4 Polimorfismo 7 2.5 Herencia 7 3. 4. Caractersticas del Java 8 Netbeans 9 4.1 Historia 10 4.2 Netbeans Hoy 10
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 2

..

1.3. La Programacin Orientada a Objetos

Autor: Mg. Ing. Javier Martnez Carrin

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 3

Autor: Mg. Ing. Javier Martnez Carrin

1.- PROGRAMACIN ORIENTADA A OBJETOS: La Programacin Orientada a Objetos (POO u OOP segn siglas en ingls) es un paradigma de programacin que define los programas en trminos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o mtodos) e identidad (propiedad del objeto que lo diferencia del resto). La programacin orientada a objetos expresa un programa como un conjunto de estos objetos, que colaboran entre ellos para realizar tareas. Esto permite hacer los programas y mdulos ms fciles de escribir, mantener y reutilizar. De esta forma, un objeto contiene toda la informacin, (los denominados atributos) que permite definirlo e identificarlo frente a otros objetos pertenecientes a otras clases (e incluso entre objetos de una misma clase, al poder tener valores bien diferenciados en sus atributos). A su vez, dispone de mecanismos de interaccin (los llamados mtodos) que favorecen la comunicacin entre objetos (de una misma clase o de distintas), y en consecuencia, el cambio de estado en los propios objetos. Esta caracterstica lleva a tratarlos como unidades indivisibles, en las que no
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 4

Autor: Mg. Ing. Javier Martnez Carrin

se separan (ni deben separarse) informacin (datos) y procesamiento (mtodos). Dada esta propiedad de conjunto de una clase de objetos, que al contar con una serie de atributos definitorios, requiere de unos mtodos para poder tratarlos (lo que hace que ambos conceptos estn ntimamente entrelazados), el programador debe pensar indistintamente en ambos trminos, ya que no debe nunca separar o dar mayor importancia a los atributos en favor de los mtodos, ni viceversa. Hacerlo puede llevar al programador a seguir el hbito errneo de crear clases contenedoras de informacin por un lado y clases con mtodos que manejen esa informacin por otro (llegando a una programacin estructurada camuflada en un lenguaje de programacin orientado a objetos). Esto difiere de la programacin estructurada tradicional, en la que los datos y los procedimientos estn separados y sin relacin, ya que lo nico que se busca es el procesamiento de unos datos de entrada para obtener otros de salida. La programacin estructurada anima al programador a pensar sobre todo en trminos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programacin estructurada se escriben funciones y despus les pasan datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y mtodos y despus envan mensajes a los objetos diciendo que realicen esos mtodos en s mismos. 1.1 ORIGEN Los conceptos de la programacin orientada a objetos tienen origen en Simula 67, un lenguaje diseado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cmputo Noruego en Oslo. Segn se informa, la historia es que trabajaban en simulaciones de naves, y fueron confundidas por la explosin combinatoria de cmo las diversas cualidades de diversas naves podan afectar unas a las otras. La idea ocurri para agrupar los diversos tipos de naves en diversas clases de objetos, siendo responsable cada clase de objetos de definir sus propios datos y comportamiento. Fueron refinados ms tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versin fue escrita sobre Basic) pero diseado para ser un sistema completamente dinmico en el cual los objetos se podran crear y modificar "en marcha" en lugar de tener un sistema basado en programas estticos. La programacin orientada a objetos tom posicin como el estilo de programacin dominante a mediados de los aos ochenta, en gran parte debido a la influencia de C++, una extensin del lenguaje de
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 5

Autor: Mg. Ing. Javier Martnez Carrin

programacin C. Su dominacin fue consolidada gracias al auge de las Interfaces grficas de usuario, para los cuales la programacin orientada a objetos est particularmente bien adaptada. En este caso, se habla tambin de programacin dirigida por eventos. El Eiffel de Bertrand Meyer fue un temprano y moderadamente acertado lenguaje con esos objetivos pero ahora ha sido esencialmente reemplazado por Java, en gran parte debido a la aparicin de Internet, y a la implementacin de la mquina virtual de Java en la mayora de navegadores. PHP en su versin 5 de a poco se ha ido masificando y soporta una orientacin completa a objetos, cumpliendo todas las caractersticas propias de la orientacin a objetos. 1.2 DIFERENCIAS CON LA PROGRAMACIN ESTRUCTURADA Aunque la programacin estructurada (a veces llamada procedural o procedimental) condujo a mejoras de la tcnica de programacin secuencial, los mtodos modernos de diseo de software orientado a objetos incluyen mejoras entre las que estn el uso de los patrones de diseo, diseo por contrato, y lenguajes de modelado (ej: UML). Las principales diferencias entre la programacin estructurada y la orientada a objetos son: La programacin orientada a objetos es ms moderna, es una evolucin de la programacin estructurada que plasma en el diseo de una familia de lenguajes conceptos que existan previamente con algunos nuevos. La POO se basa en lenguajes que soportan sintctica y semnticamente la unin entre los tipos abstractos de datos y sus operaciones (a esta unin se la suele llamar clase). La POO incorpora en su entorno de ejecucin mecanismos tales como el polimorfismo y el envo de mensajes entre objetos. Errneamente se le adjudica a la programacin estructurada clsica ciertos problemas como si fueran inherentes a la misma. Esos problemas fueron hacindose cada vez ms graves y antes de la programacin orientada a objetos diversos autores (de los que podemos destacar a Yourdon) encontraron soluciones basadas en aplicar estrictas metodologas de trabajo. De esa poca son los conceptos de cohesin y acoplamiento. De esos problemas se destacan los siguientes: Modelo mental anmalo. Nuestra imagen del mundo se apoya en los seres, a los que asignamos nombres sustantivos, mientras la programacin clsica se basa en el comportamiento, representado usualmente por verbos.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 6

Autor: Mg. Ing. Javier Martnez Carrin

Es difcil modificar y extender los programas, pues suele haber datos compartidos por varios subprogramas, que introducen interacciones ocultas entre ellos. Es difcil mantener los programas. Casi todos los sistemas informticos grandes tienen errores ocultos, que no surgen a la luz hasta despus de muchas horas de funcionamiento. Es difcil reutilizar los programas. Es prcticamente imposible aprovechar en una aplicacin nueva las subrutinas que se disearon para otra. Es compleja la coordinacin y organizacin entre programadores para la creacin de aplicaciones de media y gran envergadura. En la programacin orientada a objetos pura no deben utilizarse llamadas de subrutinas, nicamente mensajes. 1.3 LA PROGRAMACIN ORIENTADA A OBJETOS (POO) COMO SOLUCIN: La programacin orientada a objetos es una nueva forma de programar que trata de encontrar una solucin a estos problemas. Introduce nuevos conceptos, que superan y amplan conceptos antiguos ya conocidos. Entre ellos destacan los siguientes: Objeto: Entidad provista de un conjunto de propiedades o atributos (datos) y de comportamiento o funcionalidad (mtodos). Corresponden a los objetos reales del mundo que nos rodea, o a objetos internos del sistema (del programa). Clase: Definiciones de las propiedades y comportamiento de un tipo de objeto concreto. La instanciacin es la lectura de estas definiciones y la creacin de un objeto a partir de ellas. Mtodo: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecucin se desencadena tras la recepcin de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un mtodo puede producir un cambio en las propiedades del objeto, o la generacin de un "evento" con un nuevo mensaje para otro objeto del sistema. Evento: Un suceso en el sistema (tal como una interaccin del usuario con la mquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. Tambin se puede definir como evento, a la reaccin que puede desencadenar un objeto, es decir la accin que genera. Mensaje: Una comunicacin dirigida a un objeto, que le ordena que ejecute uno de sus mtodos con ciertos parmetros asociados al evento que lo gener.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 7

Autor: Mg. Ing. Javier Martnez Carrin

Propiedad o atributo: Contenedor de un tipo de datos asociados a un objeto (o a una clase de objetos), que hace los datos visibles desde fuera del objeto, y cuyo valor puede ser alterado por la ejecucin de algn mtodo. Estado interno: es una propiedad invisible de los objetos, que puede ser nicamente accedida y alterada por un mtodo del objeto, y que se utiliza para indicar distintas situaciones posibles para el objeto (o clase de objetos). Componentes de un objeto: Atributos, identidad, relaciones y mtodos. Representacin de un objeto: un objeto se representa por medio de una tabla o entidad que est compuesta por sus atributos y funciones correspondientes. Tipo: Conjunto de firma de mtodos con un nombre que lo identifica. Un tipo puede ser definido a travs de una Clase o una Interface. En comparacin con un lenguaje imperativo, una "variable", no es ms que un contenedor interno del atributo del objeto o de un estado interno, as como la "funcin" es un procedimiento interno del mtodo del objeto. 2.- CARACTERSTICAS DE LA POO: Hay un cierto desacuerdo sobre exactamente qu caractersticas de un mtodo de programacin o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las caractersticas siguientes son las ms importantes (para ms informacin, seguir los enlaces respectivos): 2.1 Abstraccin: Cada objeto en el sistema sirve como modelo de un "agente" abstracto que puede realizar trabajo, informar y cambiar su estado, y "comunicarse" con otros objetos en el sistema sin revelar cmo se implementan estas caractersticas. Los procesos, las funciones o los mtodos pueden tambin ser abstrados y cuando lo estn, una variedad de tcnicas son requeridas para ampliar una abstraccin. 2.2 Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstraccin. Esto permite aumentar la cohesin de los componentes del sistema. Algunos autores confunden este concepto con el principio de 2.3 ocultacin, principalmente porque se suelen emplear conjuntamente. Principio de ocultacin: Cada objeto est aislado del exterior, es un mdulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cmo pueden interactuar con los objetos de la
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 8

Autor: Mg. Ing. Javier Martnez Carrin

clase. El aislamiento protege a las propiedades de un objeto contra su modificacin por quien no tenga derecho a acceder a ellas, solamente los propios mtodos internos del objeto pueden acceder a su estado. Esto asegura que otros objetos no pueden cambiar el estado interno de un objeto de maneras inesperadas, eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes relajan esto, permitiendo un acceso directo a los datos internos del objeto de una manera controlada y limitando el grado de abstraccin. La aplicacin entera se reduce a un agregado o rompecabezas de objetos. 2.4 Polimorfismo: comportamientos diferentes, asociados a objetos distintos, pueden compartir el mismo nombre, al llamarlos por ese nombre se utilizar el comportamiento correspondiente al objeto que se est usando. O dicho de otro modo, las referencias y las colecciones de objetos pueden contener objetos de diferentes tipos, y la invocacin de un comportamiento en una referencia producir el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecucin", esta ltima caracterstica se llama asignacin tarda o asignacin dinmica. Algunos lenguajes proporcionan medios ms estticos (en "tiempo de compilacin") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++. 2.5 Herencia: las clases no estn aisladas, sino que se relacionan entre s, formando una jerarqua de clasificacin. Los objetos heredan las propiedades y el comportamiento de todas las clases a las que pertenecen. La herencia organiza y facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser definidos y creados como tipos especializados de objetos preexistentes. Estos pueden compartir (y extender) su comportamiento sin tener que reimplementar su comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases y estas en rboles o enrejados que reflejan un comportamiento comn. Cuando un objeto hereda de ms de una clase se dice que hay herencia mltiple; esta caracterstica no est soportada por algunos lenguajes (como Java). LENGUAJES ORIENTADOS A OBJETOS Entre los lenguajes orientados a objetos destacan los siguientes: Action Script 3 Ada C++ C#
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 9

Autor: Mg. Ing. Javier Martnez Carrin

VB.NET Visual FoxPro Clarion Builder C++ Delphi Harbour Eiffel Java Lexico (en castellano) Objective-C Ocaml Oz Perl (soporta herencia mltiple) PHP (en su versin 5) PowerBuilder Python Ruby Smalltalk Magik (SmallWorld) Muchos de estos lenguajes de programacin no son puramente orientados a objetos, sino que son hbridos que combinan la OOP con otros paradigmas. Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados aadiendo extensiones orientadas a objetos a un lenguaje de programacin clsico. Un nuevo paso en la abstraccin de paradigmas de programacin es la Programacin Orientada a Aspectos (POA). Aunque es todava una metodologa en estado de maduracin, cada vez atrae a ms investigadores e incluso proyectos comerciales en todo el mundo. Tambin es necesario recalcar que en la programacin orientada a objetos es factible de utilizar en JavaScript 3.- CARACTERISTICAS DE JAVA: Portable: Se ejecuta sobre cualquier Sistema Operativo o Hardware Compilado e Interpretado: Por que usa de un compilado especial para la generacin de cdigo ejecutable y un interprete para su ejecucin.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 10

Autor: Mg. Ing. Javier Martnez Carrin

Seguro: Tiende a cero el hecho de que la aplicacin deje de funcionar porque quien administra la memoria y los recursos de la aplicacin es el mismo Java, no esta permitido que el programador accese al control de la memoria.

Sencillo: Porque para aprender el Lenguaje se requiere menos esfuerzo que el Lenguaje C, tambin por que la Arquitectura del Lenguaje y sus librerias son totalmente organizadas y simples.

Mltiples Tecnologas: Con Java se pueden desarrollar aplicaciones Cliente Servidor con el interfaz grfico vidsual del mismo Java, tambin aplicaciones Web centralizadas 2, 3 y n capas, aplicaciones Wav y otras.

QUE ES EL JDK?: JDK (Java Development Kit) es conjunto de Apis y utilitarios que permimten ejecutar aplicaciones hechas en Java, dentro de l se encuentran esencialmente: - Java Virtual Machina (Java VM), Compilador de java, utilitarios para RMI, comprensor jar, etc. - Java Aplicattion Programming Interface (Java API) - La actual versin es el Jdk 1.4 al que Sun Microsystem lo llama como Java 2 JAVA Y SUS TECNOLOGAS Existen muchas tecnologas de java que ofrece, eso quiere decir que se pueden desarrollar aplicaciones de cualquier tipo en el mundo moderno. Applets, que son miniaplicaciones que es bajan por la red y se ejecutan dentro del browser. Controles virtuales Java swing para disear el GUI con Java y desarrollar una aplicacin tradicional. JDBC: Drivers y APIs para acceso a base de datos, escritas en java y con amplio soporte para todas las bases de datos del mundo (Informix, Oracle, Sybase, MSQLServer, MySql,DB2, etc.) Apis para trabajar en red y comunicaciones, URLs, TCp and UDP sockets. Servlets y Java Server Pages (JSP) para desarrollar aplicaciones Web. Java Mail para envos de correos electronicos automatizados. JNI para invocar codigo nativo ( exe, dlls, scripts, rutinas en C.) desde Java RMI para aplicaciones distribuidas en 3 y n capas. Componentes: JavaBeans, y Enterprice Java Beans. Arsenales de Parsers Java para XML.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 11

Autor: Mg. Ing. Javier Martnez Carrin

JINI connection tecnology cuya filosofa es Todo en uno sin cables, drivers ni configuraciones engorrosas entre los dispositivos, esto esta ubicado en los llamados services de la red. Apis para desarrollar Aplicaciones WAP. Application Servers multiplataformas de diferentes fabricantes y estndares. 4.- NETBEANS Se refiere a una plataforma para el desarrollo de aplicaciones de escritorio usando Java y a un Entorno integrado de desarrollo (IDE) desarrollado usando la Plataforma NetBeans. La plataforma NetBeans permite que las aplicaciones sean desarrolladas a partir de un conjunto de componentes de software llamados mdulos. Un mdulo es un archivo Java que contiene clases de java escritas para interactuar con las APIs de NetBeans y un archivo especial (manifest file) que lo identifica como mdulo. Las aplicaciones construidas a partir de mdulos pueden ser extendidas agregndole nuevos mdulos. Debido a que los mdulos pueden ser desarrollados independientemente, las aplicaciones basadas en la plataforma NetBeans pueden ser extendidas fcilmente por otros desarrolladores de software. NetBeans es un proyecto de cdigo abierto de gran xito con una gran base de usuarios, una comunidad en constante crecimiento, y con cerca de 100 socios en todo el mundo. Sun MicroSystems fund el proyecto de cdigo abierto NetBeans en junio 2000 y contina siendo el patrocinador principal de los proyectos. 4.1 HISTORIA NetBeans comenz como un proyecto estudiantil en Republica Checa (originalmente llamado Xelfi), en 1996 bajo la tutora de la Facultad de Matemticas y Fsica en la Universidad de Charles en Praga. La meta era escribir un entorno integrado de desarrollo (IDE) para Java parecida a la de Delphi. Xelfi fue el primer entorno integrado de desarrollo escrito en Java, con su primer pre-release en 1997. Xelfi fue un proyecto divertido para trabajar, ya que las IDEs escritas en Java eran un territorio desconocido en esa poca. El proyecto atrajo suficiente inters, por lo que los estudiantes, despus de graduarse, decidieron que lo podan convertir en un proyecto comercial. Prestando espacios web de amigos y familiares, formaron una compaa alrededor de esto. Casi todos ellos siguen trabajando en NetBeans.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 12

Autor: Mg. Ing. Javier Martnez Carrin

Tiempo despus, ellos fueron contactados por Roman Stanek, un empresario que ya haba estado relacionado con varias iniciativas en la Republica Checa. l estaba buscando una buena idea en que invertir, y encontr en Xelfi una buena oportunidad. Ellos se reunieron, y el negocio surgi. El plan original era desarrollar unos componentes JavaBeans para redes. Jarda Tulach, quien dise la arquitectura bsica de la IDE, surgi con la idea de llamarlo NetBeans, con el fin de describir lo que ellos haran. Cuando las especificaciones de los Enterprise JavaBeans salieron, ellos decidieron trabajar con este estndar, ya que no tenia sentido competir con l, sin embargo el nombre de NetBeans se qued. En la primavera de 1999, Netbeans DeveloperX2 fue lanzado, soportando Swing. Las mejoras de rendimiento que llegaron con el JDK 1.3, lanzado en otoo de 1999, hicieron a NetBeans una alternativa realmente viable para el desarrollo de herramientas. En el verano de 1999, el equipo trabaj duro para redisear a DeveloperX2 en un NetBeans ms modular, lo que lo convirti en la base de NetBeans hoy en da. Algo ms paso en el verano de 1999. Sun Microsystems quera una mejor herramienta de desarrollo de Java, y comenz a estar interesado en NetBeans. En otoo de 1999, con la nueva generacin de NetBeans en Beta, el acuerdo fue realizado. Sun adquiri otra compaa de herramientas al mismo tiempo, Fort, y decidi renombrar NetBeans a Fort for Java. El nombre de NetBeans desapareci de vista por un tiempo. Seis meses despus, se tom la decisin de hacer a NetBeans open source. Mientras que Sun haba contribuido considerablemente con lneas de cdigo en varios proyectos de cdigo abierto a travs de los aos, NetBeans se convirti en el primer proyecto de cdigo abierto patrocinado por ellos. En Junio del 2000 NetBeans.org fue lanzado. Fuente: Breve historia de NetBeans (en ingls) 4.2 NETBEANS HOY Un proyecto de cdigo abierto no es nada ms ni nada menos que un proceso. Toma tiempo encontrar el balance perfecto. Alrededor del primer ao, (a travs de NetBeans 3.2) fue crucial como inicio. Los dos aos siguientes, se aprendi que sirve en trminos de procesos de cdigo abierto. En los primeros dos aos, el proceso de desarrollo era tan abierto, que haba ms debate que implementacin. Con NetBeans 3.5 se mejor enormemente en desempeo, y con la llegada de NetBeans 3.6, se reimplement el sistema de ventanas y la
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 13

Autor: Mg. Ing. Javier Martnez Carrin

hoja de propiedades, y se limpi enormemente la interfaz. NetBeans 4.0 fue un gran cambio en cuanto a la forma de funcionar del IDE, con nuevos sistemas de proyectos, con el cambio no solo de la experiencia de usuario, sino del reemplazo de muchas piezas de la infraestructura que haba tenido NetBeans anteriormente. NetBeans IDE 5.0 introdujo un soporte mucho mejor para el desarrollo de nuevos mdulos, el nuevo constructor intuitivo de interfaces Matisse, un nuevo y rediseado soporte de CVS, soporte a Sun ApplicationServer 8.2, Weblogic9 y JBoss 4. netbeans recomendable 4.3 LA PLATAFORMA NETBEANS Durante el desarrollo del NetBeans IDE ocurri una cosa interesante. La gente empez a construir aplicaciones usando el NetBeans core runtime con sus propios plug-ins, de hecho, esto se convirti en un mercado bastante grande. La Plataforma NetBeans es una base modular y extensible usada como una estructura de integracin para crear aplicaciones de escritorio grandes. Empresas independientes asociadas, especializadas en desarrollo de software, proporcionan extensiones adicionales que se integran fcilmente en la plataforma y que pueden tambin utilizarse para desarrollar sus propias herramientas y soluciones. La plataforma ofrece servicios comunes a las aplicaciones de escritrio, permitindole al desarrollador enfocarse en la lgica especfica de su aplicacin. Entre las caractersticas de la plataforma estn: Administracin de las interfaces de usuario (ej. mens y barras de herramientas) Administracin de las configuraciones del usuario Administracin del almacenamiento (guardando y cargando cualquier tipo de dato) Administracin de ventanas Framework basado en asistentes (dilogos paso a paso)

4.4 NETBEANS IDE El IDE NetBeans es un IDE - una herramienta para programadores pensada para escribir, compilar, depurar y ejecutar programas. Est escrito en Java - pero puede servir para cualquier otro lenguaje de programacin. Existe adems un nmero importante de mdulos para extender el IDE NetBeans. El IDE NetBeans es un producto libre y gratuito sin restricciones de uso. El NetBeans IDE es un IDE de cdigo abierto escrito completamente en Java usando la plataforma NetBeans. El NetBeans IDE soporta el
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 14

Autor: Mg. Ing. Javier Martnez Carrin

desarrollo de todos los tipos de aplicacin Java (J2SE, web, EJB y aplicaciones mviles). Entre sus caractersticas se encuentra un sistema de proyectos basado en Ant, control de versiones y refactoring. La versin actual es NetBeans IDE 5.5, la cual fue lanzada en Octubre de 2006. NetBeans IDE 5.5 extiende las caractersticas existentes del Java EE (incluyendo Soporte a Persistencia, EJB 3 y JAX-WS). Adicionalmente, el NetBeans Enterprise Pack soporta el desarrollo de Aplicaciones empresariales con Java EE 5, incluyendo herramientas de desarrollo visuales de SOA, herramientas de esquemas XML, orientacin a web servicies (for BPEL), y modelado UML. El NetBeans C/C++ Pack soporta proyectos de C/C++. Modularidad. Todas las funciones del IDE son provistas por mdulos. Cada mdulo provee una funcin bien definida, tales como el soporte de Java, edicin, o soporte para el sistema de control de versiones. NetBeans contiene todos los mdulos necesarios para el desarrollo de aplicaciones Java en una sola descarga, permitindole al usuario comenzar a trabajar inmediatamente. Sun Studio, Sun Java Studio Enterprise, y Sun Java Studio Creator de Sun Microsystems han sido todos basados en el IDE NetBeans. Desde Julio de 2006, NetBeans IDE es licenciado bajo la Common Development and Distribution License (CDDL), una licencia basada en la Mozilla Public License (MPL). NETBEANS ADD-ON PACKS Estos son los paquetes adicionales de NetBeans. NetBeans Enterprise Pack Provee Soporte para la creacin de aplicaciones Orientadas a Servicios (SOA), incluyendo herramientas de esquemas XML, un editor WSDL, y un editor BPEL para web services. Pack de Movilidad de NetBeans El Pack de Movilidad de NetBeans es una herramienta para desarrollar aplicaciones que se ejecutan en telfonos mviles El Pack de Movilidad puede ser usado para escribir, probar, y depurar aplicaciones para la plataforma Java ME, tecnologa existente en dispositivos mviles. Profiler de NetBeans El Profiler de NetBeans es una herramienta para la optimizacin de aplicaciones Java: Ayuda a encontrar cuellos de botella en la memoria y a optimizar la velocidad de las aplicaciones. El C/C++ Native Development Module
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 15

Autor: Mg. Ing. Javier Martnez Carrin

Soporta

proyectos

de

C/C++.

Ms

informacin

http://www.netbeans.org/kb/55/1/cnd-index.html El Visual Web Pack Permite rpida y visualmente, construir aplicaciones web estndar, incluyendo Soporte para AJAX y componentes JSF. 4.5 INSTALACIN DE NETBEANS IDE 6.5 A continuacin se darn las instrucciones de como instalar NetBeans 6.5 IDE (Standalone Versin) en cada una de las plataformas soportadas. Recuerde que el JDK de java ya debe estar instalado en el sistema. INSTALACIN EN WINDOWS Despus de haber bajado el instalador, dar doble clic sobre el icono para iniciar el instalador. Despus aparecer el Acuerdo de Licenciamiento (License Agreement), acptelo y de clic en Siguiente (Next). Especificar un directorio vaco donde instalar Netbeans IDE 6.5. Dar clic en Siguiente (Next). Selecciones el JDK que se quiere usar junto con el NetBeans IDE de la lista de seleccin si hay ms de uno. Dar clic en Siguiente (Next). Verifique que el directorio de instalacin es el correcto y que se cuenta con espacio suficiente en el sistema para la instalacin. De clic en Siguiente (Next) para iniciar la instalacin. INSTALACIN EN SISTEMAS OPERATIVOS SOLARIS (SOLARIS OS) Ejecute el instalador escribiendo lo siguiente en la lnea de comando (De nuevo, netbeans_installer es el nombre del instalador de NetBeans que se baj)): $ ./netbeans_installer Despus aparecer el Acuerdo de Licenciamiento (License Agreement), acptelo y de clic en Siguiente (Next). Especificar un directorio vaco donde instalar Netbeans IDE 6.5. Dar clic en Siguiente (Next). Selecciones el JDK que se quiere usar junto con el NetBeans IDE de la lista de seleccin si hay ms de uno. Dar clic en Siguiente (Next). Verifique que el directorio de instalacin es el correcto y que se cuenta con espacio suficiente en el sistema para la instalacin. De clic en Siguiente (Next) para iniciar la instalacin. Y luego finalizar el instalador INSTALACIN EN LINUX

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 16

Autor: Mg. Ing. Javier Martnez Carrin

Ejecute el instalador escribiendo lo siguiente en la lnea de comando (De nuevo, netbeans_installer es el nombre del instalador de NetBeans que se baj)): $ ./netbeans_installer Despus aparecer el Acuerdo de Licenciamiento (License Agreement), acptelo y de clic en Siguiente (Next). Especificar un directorio vaco donde instalar Netbeans IDE 6.5. Dar clic en Siguiente (Next). Selecciones el JDK que se quiere usar junto con el NetBeans IDE de la lista de seleccin si hay ms de uno. Dar clic en Siguiente (Next). Verifique que el directorio de instalacin es el correcto y que se cuenta con espacio suficiente en el sistema para la instalacin. De clic en Siguiente (Next) para iniciar la instalacin. 4.6 EJECUTAR NETBEANS IDE 6.5 A continuacin se explicar la forma de ejecutar NetBeans 6.5 IDE en los diferentes sistemas operativos. EJECUTAR EN WINDOWS Para ejecutar el IDE en Maquinas con Microsoft Windows hacer lo siguiente: Dar Doble clic en el icono de NetBeans IDE en el escritorio. Desde el Men Inicio, seleccionar NetBeans IDE 6.5 > NetBeans IDE Desinstalar NetBeans IDE 6.5 operativos. Desinstalar en Windows [editar]Desde el Men Inicio, escoger Panel de Control. Dar doble clic en el icono de Adicionar o Eliminar Programas. Seleccionar NetBeans IDE 6.5 de la lista y dar clic en Remover. 4.7 VERSIONES VERSIN NetBeans 6.5 NetBeans 5.5.1 NetBeans 5.5 NetBeans 5.0 NetBeans 4.1 NetBeans 4.0 NetBeans 3.6 NetBeans 3.5 5. FECHA DE LANZAMIENTO Febrero 02 de 2008 Mayo 24 de 2007 Octubre 30 de 2006 Enero 2006 Mayo 2005 Diciembre 2004 Abril 2004 Junio 2003 [editar]A continuacin se mostrar como desinstalar NetBeans 6.5 IDE en los diferentes sistemas

VARIABLES, TIPOS DE DATOS, OPERADORES Y EXPRESIONES: 5.1 TIPOS DE DATOS

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 17

Autor: Mg. Ing. Javier Martnez Carrin

Existen 2 categoras de datos principales en el lenguaje Java: Los tipos primitivos y los tipos referenciales TIPO Byte 8 byte Short 16 Int 32 Long 64 Float 32 simple Double 64 simple (otros tipos) Char 16 boolean (verdadero o falso) 5.2 TIPOS REFERENCIADOS Los tipos referenciados se llaman as porque el valor de una variable de referencia es una referencia (un puntero) hacia el valor real. En Java tenemos los arrays, las clases y los interfaces como tipos de datos referenciados. 5.3 VARIABLES Un programa se refiere al valor de una variable por su nombre. Por convencin, en Java, los nombres de las variables empiezan con una letra minscula (los nombres de las clases empiezan con una letra mayscula). Un nombre de variables Java: Debe ser un identificador legal de Java comprendido en una serie de caracteres Unicote. Unicote es un sistema de codificacin que soporta texto escrito en distintos lenguajes humanos. Unicote permite la codificacin de 34.168 caracteres. Esto le permite utilizar en sus programas Java varios alfabetos como el Japones, el Griego, el Ruso o el Hebreo. Esto es importante para que los programadores puedan escribir cdigo en su lenguaje nativo. No puede ser el mismo que una palabra clave o el nombre de un valor booleano (true o false)
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 18

TAMAO / FORMATO bit complemento a 2 bit complemento a 2 bit complemento a 2 bit complemento a 2 bit IEEE 754 bit IEEE 754 Coma Coma

DESCRIPCIN Entero de un Entero corto Entero Entero largo flotante flotante de de precisin precisin

(Nmeros enteros)

(Nmeros reales)

bit Carcter True o false

Un solo carcter Un valor booleano

Autor: Mg. Ing. Javier Martnez Carrin

No deben tener el mismo nombre que otras variables cuyas declaraciones aparezcan en el mismo mbito. TIP: Estndar para darles nombre a las variables: Los nombres de variables empiezan por una letra minsculas una variable esta compuesta de mas de una palabra, como nombre Apellido las palabras se ponen juntas y cada palabra despus de la primera empieza con una letra mayscula. 5.4 OPERADORES Los operadores realizan algunas funciones en uno o dos operadores .los operadores que requieren un operador se llaman operadores usuarios .Por ejemplo, ++ es un operador usuario que incrementa el valor su operando en uno. Los operadores que requieren dos operando se llaman operadores binarios. El operador = es un operador binario que asigna un valor del operando derecho al operando izquierdo. Los operadores usuarios en Java pueden utilizar la notacin de prefijos o de sufijo. La notacin de prefijo significa que el operador aparece antes de su operando: operador operando. La notacin de sufijo significa que el operador aparece despus de su operando: operando operador Todos los operadores binarios de java tienen la misma notacin, es decir aparecen entre los dos operandos: op1 operador op2 El lenguaje Java soporta varios operadores aritmticos, incluyendo + (suma), - (resta), * (multiplicacin), / (divisin), y % (modulo) en todos los nmeros enteros y de coma flotante. Por ejemplo, puede utilizar este cdigo Java para sumar dos nmeros: a+b O este cdigo para calcular el resto de una divisin: c%d Esta tabla sumariza todas las operaciones aritmticas binarias Java: Operador Uso Descripcin + op1 + op2 Suma op1 y op2 - op1 op2 Resta op1 y op2 * op1* op2 Multiplicar op1 y op2 / op1 / op2 Divide op1 y op2 % op1 % op2 Obtiene el resto de dividir op1 por op2
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 19

Autor: Mg. Ing. Javier Martnez Carrin

Nota: El lenguaje Java extiende la definicin del operador + para incluir la concatenacin de cadenas Los operadores + y tienen versiones unarias que seleccionan el signo del operando: Operador Uso Descripcin + + op Indicar un valor positivo - - op Niega el operando Adems, existen dos operadores de atajos aritmticos, ++ que incrementa en uno su operando, y que decrementa en uno el valor de su operando. Operador Uso Descripcin ++ op++ Incrementa op en 1; evala el valor antes de incrementar. ++ ++ op Incrementa op en 1; evala el valor despus de incrementar -- op-- Decrementa op en 1 ; evala el valor antes de decrementar en 1 -- --op Decrementa op en 1; evala el valor despus de decrementar Operadores Relacinales Operadores Uso Descripcin > op1 >op2 Op1 es mayor que op2 >= op1>=op2 Op1 es mayor o igual que op2 < op1<op2 Op1 es menor que op2 <= op1<=op2 Op1 es menor o igual que op2 == op1==op2 Op1 y op2 son iguales != op1!=op2 Op1 y op2 son distintos Operadores de asignacin Se utiliza el operador de asignacin =, para asignar un valor a otro. Adems del operador de asignacin bsico, Java proporciona varios operadores de asignacin que permiten realizar operaciones aritmticas, lgicas o de bits y una operacin de asignacin al mismo tiempo. Especficamente, suponga que quiera aadir un nmero a una variable y asignar el resultado dentro de la misma variable, como esto: i=i+2 Puedes ordenar esta sentencia utilizando el operador + = i += 2; Las dos lneas de cdigo anteriores son equivalentes. Esta tabla lista los operadores de asignacin y sus equivalentes: Operador Uso Equivale a
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 20

Autor: Mg. Ing. Javier Martnez Carrin

+= op1 += op2 Op1 = op1 + op2 -= op1 -= op2 Op1 = op1 - op2 *= op1 *= op2 Op1 = op1 * op2 /= op1 / = op2 Op1 = op1 / op2 %= op1 %= op2 Op1 = op1 % op2 &= op1 &= op2 Op1 = op1 & op2 | = op1 |= op2 Op1 = op1 | op2 ^= op1^= op2 Op1 = op1 ^ op2 <<= op1 <<= op2 Op1 = op1 << op2 >>= op1>>=op2 Op1 = op1 >> op2 >>>= op1 >>>= op2 Op1 = op1 >>> op2 Operadores Lgicos Operador Uso Devuelve trae si && op1 && op2 Op1 y op2 son verdaderos | | op1 | | op2 Uno de los dos es verdadero ! ! op Op es falso Ejemplo: Verificando si la nota esta en el intervalo cerrado [0, 20] If ( nota >0 && nota<= 20) { } Ejemplo: 1) Construir la expresin siguiente en Java: Solucin: f = Math.sqrt ((a+1)/2); 2) Si a = 20, b = 3; Cual es el valor final de v: V = a +b / 2+1 Respuesta: 22 6.- SENTENCIA DE CONTROL DE FLUJO 6.1 LA SENTENCIA IF if (Condicin) { } 6.2 LA SENTENCIA IF ELSE if (respuesta == OK) {
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 21

/ / instrucciones que es ejecutan solo cuando Condicin es true

Autor: Mg. Ing. Javier Martnez Carrin

/ / Cdigo para la accin respuesta = OK true } else { / / cdigo para la accin respuesta no igual a OK false } Ejemplo: rutina de anidamiento de if else int nota; String mensaje = null; if (nota >=90) { mensaje = Sobresaliente; } else if (nota >= 80) { mensaje = Notable; } else if (nota >=70) { mensaje = Bien; } else if (nota >= 60) { mensaje = Suficiente;} else { mensaje = Insuficiente; } 6.3 LA SENTENCIA SWITCH La sentencia switch se utiliza para realizar sentencias condicionalmente basadas en algunas expresin. int mes Switch ( mes ) { Case 1: Case 2: Case 3: break; Case 4: Case 5: Case 6: Case 7: Case 8: System.out.println (Abril); System.out.println (Mayo); System.out.println (Junio); System.out.println (Julio); System.out.println (Agosto); break; break; break; break; break; System.out.println (Enero); System.out.println (Febrero); System.out.println (Marzo); break; break;

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 22

Autor: Mg. Ing. Javier Martnez Carrin

Case 9: Case 10: Case 11: Case 12: }

System.out.println (Setiembre); System.out.println (Octubre); System.out.println (Diciembre);

break; break; break;

System.out.println (Noviembre); break;

La sentencia switch evala su expresin; en este caso el valor de mes, y ejecutar la sentencia case apropiada. Decidir cuando utilizar las sentencias if o switch dependen del JUICIO personal. Puedes decidir cual utilizar basndose en la buena lectura del cdigo o en otros factores. Otro punto de inters en la sentencia svvitch son las sentencias break despus de cada case. La sentencia break hace que e! control salga de la sentencia switch y continu con la siguiente lnea. La sentencia break es necesaria porque las sentencias case se siguen ejecutando hacia abajo. Esto es sin un break explcito el flujo de control seguira secuencialmente a travs de las sentencias case siguientes. int mes, anio; int Numerodias; . Switch ( mes ) { Case 1: Case 3: Case 5: Case 7: Case 8: Case 10: Case 12: Numerodias = 31; break Case 4: Case 6: Case 9: Case 11: Numerodias = 30; Break; Case 2: If (((anio % 4 == 0) && !( anio % 100 == 0)) | | anio % 400 == 0)) numerodias = 29; else NumeroDias = 28;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 23

Autor: Mg. Ing. Javier Martnez Carrin

break } Finalmente, puede utilizar la sentencia default al final de la sentencia switch para manejar los valores que no se han manejado explicitamente por una de las sentencias case. int mes: switch (mes) { case 1: System.out.println(Enero); case 3: System.out.println(Marzo); case 5: Svstem.out.println(Mayo); case 6: Svstem.out.println(Junio); case 8: System.out.printlnAgosto); break; break; break: break; break: break: break: break; break; case 2: System.out.println(Febrero); break: case 4: System.out.println(Abril); break:

case 7: System.out.println(Julio); break: case 9: System.out.println(Septiembre); case 11: Svstem.out.println(Noviembre); case 12: System.out.println(Diciembre); } SENTENCIAS REPETITIVAS: 6.4 SENTENCIA REPETITIVA WHILE (MIENTRAS) While (expresin) { sentencia } Esto es, mientras la expresin sea verdadera, ejecutara la sentencia o sentencias. Sentencia puede ser una sola instruccin o puede ser un bloque de sentencias. Ejemplo: While (System.in.read() != -1) { Contador++; System.out.println (se ha ledo un el carcter 0 + contador); } Por convencin el corchete abierto { se coloca al final de la misma lnea donde se encuentra la sentencia while y el corchete cerrado }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 24

case 10: System.out.println( Octubre); break:

default: System.out.println(Este, no es un mes vlido!);

Autor: Mg. Ing. Javier Martnez Carrin

empieza una nueva lnea indentada a la lnea en la que se encuentra el while. Adems de while, Java tiene otros dos constructores de bucles que puede utilizar en sus programas: el bucle for y el bucle do while. 6.5 SENTENCIA REPETITIVA FOR (DESDE, PARA) for(inicio; condicin; incremento) { / / instrucciones } Ejemplo: / / a es array de cualquier tipo int i; int length = a.length; for ( i = 0 ; i < length; i ++ ) { System.out.println (i); } Imprimira los nmeros del cero hasta el 9 si el tamao del arreglo fuera 10. 6.6 SENTENCIA REPETITIVA DO WHILE (REPITE HASTA QUE) do { Sentencias } while ( Expresin Booleano); Es conveniente usar la sentencia do while cuando el bucle debe ejecutarse al menos una vez .por ejemplo, para leer informacin de un fichero, sabemos que al menos debe leer un carcter: int c; Inputstream in; do{ c = in.read( ); ... }while (c!=-1); Mientras la Expresin booleana sea verdadera seguir repitindose la ejecucin del bloque , y cuando la expresin booleana sea falsa terminara. 6.7 SENTENCIAS DE MANEJO DE EXCEPCIONES Cuando ocurre un error dentro de un mtodo Java, el mtodo puede lanzar una excepcin para indicar a su llamador que ha ocurrido un error y que el error est utilizando la sentencia throw. El mtodo llamador puede utilizar las sentencias try, catch, y finally para capturar y manejar la excepcin.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 25

Autor: Mg. Ing. Javier Martnez Carrin

CREACIN DE PROYECTO EN NETBEANS


A continuacin se da nociones bsicas de cmo crear, compilar y ejecutar un proyecto.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 26

Autor: Mg. Ing. Javier Martnez Carrin

1.

Crear una carpeta en una unidad de Almacenamiento, puede ser disco duro, memoria USB, etc. La carpeta creada para este ejemplo es FDP (2009-I)

2.

Ingresar al Java Netbeans

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 27

Autor: Mg. Ing. Javier Martnez Carrin

3.

Haz Clic en FILE y selecciona NEW PROJECT

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 28

Autor: Mg. Ing. Javier Martnez Carrin

4.

Haz Clic en Next

5.

Cuando aparece esta pantalla, te da la posibilidad de Rutear o direccionar donde se va a almacenar el Proyecto que estamos creando. Haz Clic en BROWSE

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 29

Autor: Mg. Ing. Javier Martnez Carrin

6.

Cuando aparece esta pantalla debemos de ubicar la carpeta FDP (2009-I)

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 30

Autor: Mg. Ing. Javier Martnez Carrin

7.

En el Nombre del Proyecto debemos de poner Ejemplo001, luego debemos de hacer Clic en Finish

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 31

Autor: Mg. Ing. Javier Martnez Carrin

8.

A continuacin debemos de empezar a programar

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 32

Autor: Mg. Ing. Javier Martnez Carrin

DESARROLLO DE PROGRAMAS EJEMPLOS


TEMAS: SECUENCIALES SELECTIVAS (SIMPLE, DOBLE, MLTIPLE) 1. /* Desarrolle un programa en Java que muestre algunos datos de usuario */ package ejercicio001; public class ejemplo001 { public static void main(String []args) Programa Principal { System.out.println("Universidad San Pedro de Chimbote"); System.out.println("Curso Taller de Programacin I"); System.out.println("Ingeniera Informtica y de Sistemas"); System.out.println("Chimbote 14 de Abril del 2008"); } } //Cabecera del Programa o //Nombre del Proyecto //Nombre de la Clase

2.

// Elaborar una aplicacin Java para calcular el rea de un triangulo dados la

base y la altura package ejercicio002; import java.io.*; public class Ejemplo002 { public static void main(String arg[]) throws IOException { float base,altura,area; BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ingrese base del triangulo :"); base=Float.parseFloat(br.readLine()); System.out.print("Ingrese altura del triangulo :"); altura=Float.parseFloat(br.readLine());
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 33

Autor: Mg. Ing. Javier Martnez Carrin

area=base*altura/2; System.out.println("El area del triangulo es : "+area); } } 3. /* Desarrolle un programa en Java que permita ingresar una cantidad de dinero en Soles y realice el proceso de conversin de dinero. Debes de ingresar tambin el tipo de cambio de moneda */ package ejercicio003; import java.io.*; public class Ejemplo003 { public static void main(String arg[]) throws IOException { float sol,con,dol; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingreso el Monto en Soles:"); sol=Float.parseFloat(br.readLine()); System.out.println("Ingreso el Tipo de Cambio:"); con=Float.parseFloat(br.readLine()); dol=sol/con; System.out.println("El Monto en Dolares es:"+dol); } } //Nombre del Proyecto

4. // Calcula y Reporta la Sumatoria de todos los nmeros comprendidos de 1 hasta n. Ingrese el valor de n package ejercicio004; import java.io.*; public class Ejemplo004 { public static void main(String arg[]) throws IOException { int n,sum;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 34

Autor: Mg. Ing. Javier Martnez Carrin

BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingreso el Valor de N:"); n=Integer.parseInt(br.readLine()); sum=n*(n+1)/2; System.out.println("La Sumatoria es:"+sum); } } 5. /* Una empresa comercial desea hacer un programa en Java para calcular el precio neto de un articulo de acuerdo a lo siguiente: a) Si la venta es al contado se le da el 40% de descuento. b) Si la venta es a plazos y: t<12 meses se recarga el 30% t>=12 meses se recarga el 60% Se debe ingresar el precio del artculo, el cdigo de venta (c), (p) plazos y si la venta es a plazos se debe ingresar el tiempo de pago */ package ejercicio003; import java.io.*; public class Comercial { public static void main(String arg[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String cod; double pa,pn,t; System.out.print("Ingrese Precio del Articulo :"); pa=Double.parseDouble(br.readLine()); BufferedReader C = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ingrese Codigo de Venta (c) Contado (p) plazos : "); cod=br.readLine(); if (cod.equals("c")) pn=pa*0.60;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 35

Autor: Mg. Ing. Javier Martnez Carrin

else { System.out.print("Ingrese tiempo de pago : "); t=Double.parseDouble(br.readLine()); if(t<12) else } System.out.println("El Precio Neto del Articulo es : "+pn); } } pn=1.3*pa; pn=1.6*pa;

LABORATORIO N 01
TEMAS: SECUENCIALES SELECTIVAS (SIMPLE, DOBLE, MLTIPLE) TEORA: Desarrolle en su cuaderno de trabajo las siguientes preguntas. Que entiende por contador. Explique que es asignacin. Que entiende por acumulador. Que entiende por algoritmo. Que entiende por programa. Para que se utilizan las Libreras del JAVA NETBEANS. El cdigo IOException para que se utiliza. El cdigo System.out,.println para que se utiliza. Como defino mis variables. Los contadores y los acumuladores son iguales Que entiende por Programacin Estructurada (Buscar en Internet) Que entiende por Programacin Orientada a Objetos (Buscar en Internet) PRACTICA: Desarrolle los siguientes programas utilizando el lenguaje Java NETBEANS Se pide que ingrese sus datos personales, utilizando los diferentes tipos de datos (Entero, Real, Double y Cadenas), luego deber reportar solo uno por cada tipo de dato. Ingrese su nombre, apellidos, sexo y sus 3 notas de un curso de Programacin y luego calcule su promedio y reporte sus datos (Apellidos y promedio). Ingrese inicialmente dos edades y que estos se almacenen en las variables nombres1 y nombres2 respectivamente. Ejemplo Ingreso la edad de Juan 20
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 36

Autor: Mg. Ing. Javier Martnez Carrin

se almacenar en nombres1 y la edad de Juana 22, se almacenar en nombres2, luego utilizando una variable auxiliar intercambiar las edades y reportar. (Deber reportar Juan 22 y Juana 20). Se pide que calcule la suma de los N primeros nmeros naturales. Ingresa una cantidad en moneda nacional y luego deber reportar la salida en moneda extranjera (Euros), usted determinar el tipo de cambio. Un banco local paga a su personal en dlares, y sus empleados quieren realizar compras en el centro de la ciudad de Chimbote, para esto debern cambiar a moneda nacional, ayude usted a realizar dicha transaccin. Calcula el rea del Triangulo. Dados la base y la altura. Calcula el rea del Cuadrado. Dado el lado del mismo. Calcula el rea del Rectngulo. Dados el largo y el ancho. Calcula el rea del Rombo. Calcula el permetro del cuadrado Calcula la distancia recorrida por un vehculo, sabiendo que este viaja a 55Km por hora, desde Buenos Aires hacia la Ciudad Universitaria de Los Pinos, durante el recorrido 30 minutos.

Chimbote, Abril del 2009 DESARROLLO DE PROGRAMAS EJEMPLOS


TEMAS: REPETITIVAS (DESDE, MIENTRAS, REPETIR HASTA QUE) 1. /* Se desea leer las calificaciones (Validar las calificaciones entre 0 y 20), de una clase de Informtica de N alumnos (Validar N, entre 1 y 10). Contar el nmero total de aprobados (11 o mayor que 11) Nmero total de desaprobados (10 o menor que 10). */

package laboratorio04; import java.io.*; public class CALIFICACIONES { public static void main(String[] args) throws IOException { int nota,n,ca=0,cd=0; BufferedReader InputStreamReader(System.in)); do{
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 37

br=

new

BufferedReader(new

Autor: Mg. Ing. Javier Martnez Carrin

System.out.println("Ingrese la Cantidad de Calificaciones: "); n=Integer.parseInt(br.readLine()); }while(n<1 || n>10); for(int i=0; i<n;i++) { do{ System.out.println("Ingrese la Nota:"); nota=Integer.parseInt(br.readLine()); }while(nota<0 || nota>20); if(nota>11) else } System.out.println("Cantidad de Notas Aprobatorias es : "+ca); System.out.println("Cantidad de Notas Desaprobatorias es: "+cd); } } ca++; cd++;

2.

/*

Leer las N notas de una clase de Informtica y deducir todas Muy Malas : Malas Regulares : Buenas Excelentes : Entre 0 y 5 : Entre 6 y 10

aquellas que son:

Entre 11 y 13 : Entre 14 y 17

Entre 18 y 20

Calcular y Reportar los siguientes resultados: Promedio general de notas. Reporte de cuantas notas por cada categora se obtuvo. Nota mayor de toda la clase. */ package laboratorio04; import java.io.*; public class NOTAS
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 38

Autor: Mg. Ing. Javier Martnez Carrin

{ public static void main(String[] args) throws IOException { int nota,n,mma=0,mal=0,reg=0,bue=0,exc=0,sun=0,pro,nma=0; BufferedReader InputStreamReader(System.in)); do{ System.out.println("Ingrese la Cantidad de Calificaciones: "); n=Integer.parseInt(br.readLine()); }while(n<1 || n>10); for(int i=0; i<n;i++) { do{ System.out.println("Ingrese Nota "+(i+1)+": "); nota=Integer.parseInt(br.readLine()); }while(nota<0 || nota>20); sun=sun+nota; if(nota>nma) if(nota<5) if(nota>5 && nota<11) if(nota>10 && nota<14) if(nota>13 && nota<18) if(nota>17 && nota<21) } pro=sun/n; System.out.println("REPORTE DE RESULTADOS"); System.out.println("Promedio General de Notas del Salon es : "+pro); System.out.println("Cantidad de Alumnos con Notas muy malas : "+mma); System.out.println("La Cantidad de Alumnos con Notas malas "+mal); System.out.println("Cantidad de Alumnos con Notas Regulares : "+reg); System.out.println("La Cantidad de Alumnos con Notas Buenas : "+bue); System.out.println("Cantidad de Alumnos con Notas Excelentes: "+exc); System.out.println("Nota mayor de todo el salon de clase es : "+nma); }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 39

br=

new

BufferedReader(new

nma=nota; mma++; mal++; reg++; bue++; exc++;

Autor: Mg. Ing. Javier Martnez Carrin

/* Un comercio dispone de dos tipos de artculos en fichas correspondientes a diversas sucursales con los siguientes campos: Cdigo del articulo A o B Precio unitario del artculo Nmero de artculos Realice ventas para N clientes. Calcular y Reportar lo siguiente: El nmero de artculos existentes de cada categora. El costo total de los ventas de cada categora. La Mayor venta realizada. La Menor venta realizada. */ package laboratorio04; import java.io.*; public class COMERCIO { public static void main(String[] args) throws IOException { String cod; int nar=0,cos=0,may=0,men=0,can,num,caa=0,cab=0; int sta=0,stb=0,coa=0,cob=0,pre,mca=0,mcb=0,mma=0; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); do{ System.out.println("Ingrese Cantidad de Artculos: "); can=Integer.parseInt(br.readLine()); }while(can<1 || can>10); for(int i=0; i<can;i++) { System.out.println("Ingrese Codigo del Artculo : "); cod=(br.readLine()); do{ System.out.println("Ingrese Precio del Artculo "+(i+1)+": "); pre=Integer.parseInt(br.readLine());
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 40

Autor: Mg. Ing. Javier Martnez Carrin

}while(pre<0 || pre>10000); do{ System.out.println("Ingrese Nmero de Artculos a vender:"); num=Integer.parseInt(br.readLine()); }while(num<0 || num>100); if(cod.equals("a")) { caa++; coa=pre*num; sta=sta+coa; } else { cab++; cob=pre*num; stb=stb+cob; } if(coa>mca) if(cob>mcb) } if(mca>mcb) else mma=mca; mma=mcb; mca=coa; mcb=coa;

System.out.println("REPORTE DE RESULTADOS"); System.out.println("Total de Artculos de categora A:"+caa); System.out.println("Total de Artculos de categora B:"+cab); System.out.println("Costo Total de Ventas d Artculo A:"+sta); System.out.println("Costo Total de Ventas d Artculo B:"+stb); System.out.println("La Mayor Venta realizada es:"+mma); } }

LABORATORIO N 02
TEMAS: SECUENCIALES SELECTIVAS (SIMPLE, DOBLE, MLTIPLE) TEMAS: REPETITIVAS (DESDE, MIENTRAS, REPETIR HASTA QUE)
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 41

Autor: Mg. Ing. Javier Martnez Carrin

Desarrolle los siguientes programas, utilizando la herramienta Java NETBEANS. Debe de validar los valores, es decir consistencia en los datos. 1. Dada la edad de una persona determine en que etapa del desarrollo se Etapas de Desarrollo: ETAPA Niez Adolescencia Juventud Madurez Ancianidad RANGO DE EDAD 00 - 10 11- 18 19 - 34 35 - 64 65 - 100

encuentra:

2.- En un Banco los intereses a pagar dependen del plazo al que se efecta el prstamo. Si el prstamo es a 24 meses, se paga 14% de inters anual, si es a 18 meses el 12%, a 12 meses el 10%, a 6 meses el 8% y a 3 meses el 6%. Ingrese 3. cuanto dinero y el plazo al que se realiza el prstamo y determine el inters anual a pagarse, reporte todos los resultados. Elaborar una aplicacin para calcular la siguiente serie: (Deber de ingresar los valores de x y n). x S= 3 4. 5. x2 + 5 7 x3 + xn + ..............+ 2n+1

Elaborar una aplicacin que permita determinar y listar los nmeros de tres cifras que sean capicas y nmeros perfectos. Se introduce una hora determinada del da en horas, minutos y segundos (hh:mm:ss). Luego deber reportar la hora correspondiente al siguiente segundo, es decir, deber de reportar el siguiente segundo transcurrido (hh:mm:ss+1).

6.

Realiza un programa que permita registrar las notas de los alumnos del curso de FDP, sabiendo que el las notas varan entre 0 y 20. Luego ayuda al docente a calcular y reportar lo siguiente: Cantidad de aprobados. desaprobatorias. Nota mayor del aula. Porcentaje de notas aprobadas desaprobatorias Promedio General del aula. Nota menor del aula. Porcentaje de notas Cantidad de desaprobados. Promedio de solo notas Promedio de solo notas aprobatorias. -

7.

Desarrolle un programa que permita calcular y reportar todos los nmeros primos de solo 2 cifras.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 42

Autor: Mg. Ing. Javier Martnez Carrin

Chimbote, Abril del 2009


7. CLASES 7.1 INTRODUCCIN Cuando se escribe un programa en un lenguaje orientado a objetos, definimos una plantilla o clase que describe las caractersticas y el comportamiento de un conjunto de objetos similares. La clase automvil describe las caractersticas comunes de todos los automviles: sus atributos y su comportamiento. Los atributos o propiedades se refieren a la marca o fabricante, el color, las dimensiones, si tienen dos, tres, cuatro o ms puertas, la potencia, si utiliza como combustible la gasolina o gasoil, etc. El comportamiento se refiere a la posibilidad de desplazarse por una carretera, frenar, acelerar, cambiar de marcha, girar, etc. Luego, tenemos automviles concretos, por ejemplo el automvil propio de una determinada marca, color, potencia, etc, el automvil del vecino de otra marca, de otro color, etc., el automvil de un amigo, etc Una clase es por tanto una plantilla implementada en software que describe un conjunto de objetos con atributos y comportamiento similares. Una instancia u objeto de una clase es una representacin concreta y especfica de una clase y que reside en la memoria del ordenador. 7.2 ATRIBUTOS Son las caractersticas individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables. Las variables de instancia tambin denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto. Adems de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el nmero de ruedas de un automvil es el mismo cuatro, para todos los automviles. 7.3 COMPORTAMIENTO El comportamiento de los objetos de una clase se implementa mediante funciones miembro o mtodos. Un mtodo es un conjunto de

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 43

Autor: Mg. Ing. Javier Martnez Carrin

instrucciones que realizan una determinada tarea y son similares a las funciones de los lenguajes estructurados. Del mismo modo que hay variables de instancia y de clase, tambin hay mtodos de instancia y de clase. En el primer caso, un objeto llama a un mtodo para realizar una determinada tarea, en el segundo, el mtodo se llama desde la propia clase. 7.4 LA CLASE Para crear una clase se utiliza la palabra reservada class y a continuacin el nombre de la clase. La definicin de la clase se pone entre las llaves de apertura y cierre. El nombre de la clase empieza por letra mayscula. class Rectangulo { } 7.5 LOS MIEMBROS DATO Los valores de los atributos se guardan en los miembros dato o variables de instancia. Los nombres de dichas variables comienzan por letra minscula. Vamos a crear una clase denominada Rectngulo, que describa las caractersticas comunes a estas figuras planas que son las siguientes: El origen del rectngulo: el origen o posicin de la esquina superior izquierda del rectngulo en el plano determinado por dos nmeros enteros x e y. Las dimensiones del rectngulo: ancho y alto, otros dos nmeros enteros. class Rectangulo { int x; int y; int ancho; int alto; //faltan las funciones miembro } 7.6 LAS FUNCIONES MIEMBRO En el lenguaje C++ las funciones miembro se declaran, se definen y se llaman. En el lenguaje Java las funciones miembro o mtodos solamente se definen y se llaman. //miembros dato //funciones miembro

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 44

Autor: Mg. Ing. Javier Martnez Carrin

El nombre de las funciones miembro o mtodos comienza por letra minscula y deben sugerir acciones (mover, calcular, etc.). La definicin de una funcin tiene el siguiente formato: tipo nombreFuncion(tipo parm1, tipo parm2, tipo parm3) { //...sentencias } Entre las llaves de apertura y cierre se coloca la definicin de la funcin. tipo indica el tipo de dato que puede ser predefinido int, double, etc, o definido por el usuario, una clase cualquiera. Para llamar a un funcin miembro o mtodo se escribe retorno=objeto.nombreFuncion(arg1, arg2, arg3); Cuando se llama a la funcin, los argumentos arg1, arg2, arg3 se copian en los parmetros parm1, parm2, parm3 y se ejecutan las sentencias dentro de la funcin. La funcin finaliza cuando se llega al final de su bloque de definicin o cuando encuentra una sentencia return. Cuando se llama a la funcin, el valor devuelto mediante la sentencia return se asigna a la variable retorno. Cuando una funcin no devuelve nada se dice de tipo void. Para llamar a la funcin, se escribe arg2, arg3); Una funcin suele finalizar cuando llega al final del bloque de su definicin void funcion(....) { //sentencias... } Una funcin puede finalizar antes del llegar al final de su definicin void funcion(....) { //sentencias... if(condicion) return; //sentencias.. } Una funcin puede devolver un valor (un tipo de dato primitivo o un objeto). double funcion(....) { double suma=0.0;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 45

objeto.nombreFuncion(arg1,

Autor: Mg. Ing. Javier Martnez Carrin

//sentencias... return suma; } Cualquier variable declarada dentro de la funcin tiene una vida temporal, existiendo en memoria, mientras la funcin est activa. Se trata de variables locales a la funcin. Por ejemplo: void nombreFuncion(int parm) { //... int i=5; //... } La variable parm, existe desde el comienzo hasta el final de la funcin. La variable local i, existe desde el punto de su declaracin hasta el final del bloque de la funcin. Se ha de tener en cuenta que las funciones miembro tienen acceso a los miembros dato, por tanto, es importante en el diseo de una clase decidir qu variables son miembros dato, qu variables son locales a las funciones miembro, y qu valores les pasamos a dichas funciones. Los ejemplos nos ayudarn a entender esta distincin. Hemos definido los atributos o miembros dato de la clase Rectngulo, ahora le vamos aadir un comportamiento: los objetos de la clase Rectngulo o rectngulos sabrn calcular su rea, tendrn capacidad para trasladarse a otro punto del plano, sabrn si contienen en su interior un punto determinado del plano. La funcin que calcula el rea realizar la siguiente tarea, calcular el producto del ancho por el alto del rectngulo y devolver el resultado. La funcin devuelve un entero es por tanto, de tipo int. No es necesario pasarle datos ya que tiene acceso a los miembros dato ancho y alto que guardan la anchura y la altura de un rectngulo concreto. class Rectangulo { int x, y, ancho; int alto; int calcularArea() { return (ancho*alto); } A la funcin que desplaza el rectngulo horizontalmente en dx, y verticalmente en dy, le pasamos dichos desplazamientos, y a partir de
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 46

Autor: Mg. Ing. Javier Martnez Carrin

estos datos actualizar los valores que guardan sus miembros dato x e y. La funcin no devuelve nada es de tipo void. class Rectangulo { int x; int y; int ancho; int alto; void desplazar(int dx, int dy) { x+=dx; y+=dy; } } La funcin que determina si un punto est o no en el interior del rectngulo, devolver true si el punto se encuentra en el interior del rectngulo y devolver false si no se encuentra, es decir, ser una funcin del tipo boolean. La funcin necesitar conocer las coordenadas de dicho punto. Para que un punto de coordenadas x1 e y1 est dentro de un rectngulo cuyo origen es x e y, y cuyas dimensiones son ancho y alto, se deber cumplir a la vez cuatro condiciones x1>x y a la vez x1<x+ancho Tambin se debe cumplir y1>y y a la vez y1<y+alto Como se tienen que cumplir las cuatro condiciones a la vez, se unen mediante el operador lgico AND simbolizado por &&. class Rectangulo { int x, y; int ancho; int alto; boolean estaDentro(int x1, int y1) { if((x1>x)&&(x1<x+ancho)&&(y1>y)&&(y1<y+anc ho)) { return true; return false; } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 47

Autor: Mg. Ing. Javier Martnez Carrin

En el lenguaje Java, si la primera condicin es falsa no se evalan las restantes expresiones ya que el resultado es false. Ahora bien, si la primera es verdadera true, se pasa a evaluar la segunda, si sta el falsa el resultado es false, y as sucesivamente. 8. LOS CONTRUCTORES Un objeto de una clase se crea llamando a una funcin especial denominada constructor de la clase. El constructor se llama de forma automtica cuando se crea un objeto, para situarlo en memoria e inicializar los miembros datos declarados en la clase. El constructor tiene el mismo nombre que la clase. Lo especfico del constructor es que no tiene tipo de retorno. class Rectangulo { int x, y; int ancho; int alto; Rectangulo(int x1, int y1, int w, int h) { x=x1; y=y1; ancho=w; alto=h; } } El constructor recibe cuatro nmeros que guardan los parmetros x1, y1, w y h, y con ellos inicializa los miembros dato x, y, ancho y alto. Una clase puede tener ms de un constructor. Por ejemplo, el siguiente constructor crea un rectngulo cuyo origen est en el punto (0, 0). class Rectangulo { int x; int y; int ancho; int alto; Rectangulo(int w, int h) { x=0; y=0; ancho=w; alto=h; }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 48

Autor: Mg. Ing. Javier Martnez Carrin

} Este constructor crea un rectngulo de dimensiones nulas situado en el punto (0, 0), Class Rectangulo { int x; int y; int ancho; int alto; Rectangulo() { x=0; y=0; ancho=0; alto=0; } } Con estas porciones de cdigo definimos la clase, y la guardamos en un archivo que tenga el mismo nombre que la clase Rectngulo y con extensin .java. public class Rectangulo { int x; int y; int ancho; int alto; public Rectangulo() { x=0; y=0; ancho=0; alto=0; } public Rectangulo(int x1, int y1, int w, int h) { x=x1; y=y1; ancho=w; alto=h; } public Rectangulo(int w, int h)
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 49

Autor: Mg. Ing. Javier Martnez Carrin

x=0; y=0; ancho=w; alto=h;

} int calcularArea() { return (ancho*alto); } void desplazar(int dx, int dy) { x+=dx; y+=dy; } boolean estaDentro(int x1, int y1) { if((x1>x)&&(x1<x+ancho)&&(y1>y)&&(y1<y+ancho)) { return true; } return false; } } 8.1 LOS OBJETOS Para crear un objeto de una clase se usa la palabra reservada new. Por ejemplo, Rectangulo rect1=new Rectangulo(10, 20, 40, 80); new reserva espacio en memoria para los miembros dato y devuelve una referencia que se guarda en la variable rect1 del tipo Rectngulo que denominamos ahora objeto. Dicha sentencia, crea un objeto denominado rect1 de la clase Rectngulo llamando al segundo constructor en el listado. El rectngulo estar situado en el punto de coordenadas x=10, y=20; tendr una anchura de ancho=40 y una altura de alto=80. Rectangulo rect2=new Rectangulo(40, 80); Crea un objeto denominado rect2 de la clase Rectngulo llamando al tercer constructor, dicho rectngulo estar situado en el punto de
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 50

Autor: Mg. Ing. Javier Martnez Carrin

coordenadas x=0, y=0; y tendr una anchura de ancho=40 y una altura de alto=80. Rectangulo rect3=new Rectangulo(); Crea un objeto denominado rect3 de la clase Rectangulo llamando al primer constructor, dicho rectngulo estar situado en el punto de coordenadas x=0, y=0; y tendr una anchura de ancho=0 y una altura de alto=0. 8.2 ACCESO A LOS MIEMBROS Desde un objeto se puede acceder a los miembros mediante la siguiente sintaxis objeto.miembro. Por ejemplo, podemos acceder al miembro dato ancho, para cambiar la anchura de un objeto rectngulo. rect1.ancho=100; El rectngulo rect1 que tena inicialmente una anchura de 40, mediante esta sentencia se la cambiamos a 100. Desde un objeto llamamos a las funciones miembro para realizar una determinada tarea. Por ejemplo, desde el rectngulo rect1 llamamos a la funcin calcularArea para calcular el rea de dicho rectngulo. rect1.calcularArea(); La funcin miembro area devuelve un entero, que guardaremos en una variable entera medidaArea, para luego usar este dato. int medidaArea=rect1.calcularArea(); System.out.println("El rea del rectngulo es "+medidaArea); Para desplazar el rectngulo rect2, 10 unidades hacia la derecha y 20 hacia abajo, escribiremos rect2.desplazar(10, 20); Podemos verificar mediante el siguiente cdigo si el punto (20, 30) est en el interior del rectngulo rect1. if(rect1.estaDentro(20,30)) { rectngulo"); else { } rect1.dentro() devuelve true si el punto (20, 30) que se le pasa a dicha funcin miembro est en el interior del rectngulo rect1, ejecutndose la primera sentencia, en caso contrario se ejecuta la segunda. Establecemos controles de acceso a los mismos.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 51

System.out.println("El punto est dentro del } System.out.println("El punto est fuera del rectngulo");

Autor: Mg. Ing. Javier Martnez Carrin

public class RectanguloApp1 { public static void main(String[] args) { Rectangulo rect1=new Rectangulo(10, 20, 40, 80); Rectangulo rect2=new Rectangulo(40, 80); Rectangulo rect3=new Rectangulo(); int medidaArea=rect1.calcularArea(); System.out.println("El rea del rectngulo es "+medidaArea); rect2.desplazar(10, 20); if(rect1.estaDentro(20,30)) { System.out.println("El punto est dentro del rectngulo"); } else { System.out.println("El punto est fuera del rectngulo"); } } } 8.3 LA VIDA DE UN OBJETO En el lenguaje C++, los objetos que se crean con new se han de eliminar con delete. new reserva espacio en memoria para el objeto y delete libera dicha memoria. En el lenguaje Java no es necesario liberar la memoria reservada, el recolector de basura (garbage collector) se encarga de hacerlo por nosotros, liberando al programador de una de las tareas que ms quebraderos de cabeza le producen, olvidarse de liberar la memoria reservada. Veamos un ejemplo public class UnaClase { public static void main(String[] args) { Image granImagen=creaImagen(); mostrar(graImagen); while(condicion) { calcular(); } } El objeto granImagen, continua en memoria hasta que se alcanza el final de la funcin main, aunque solamente es necesario hasta el bucle while. En C o en C++ eliminariamos dicho objeto liberando la memoria
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 52

Autor: Mg. Ing. Javier Martnez Carrin

que ocupa mediante delete. El equivalente en Java es el de asignar al objeto granImagen el valor null. public class UnaClase { public static void main(String[] args) { Image granImagen=creaImagen(); mostrar(graImagen); granImagen=null; while(condicion) { calcular(); } } } 8.4 IDENTIFICADORES Cmo se escriben los nombres de las variables, de las clases, de las funciones, etc., es un asunto muy importante de cara a la comprensin y el mantenimiento de cdigo. En la introduccin a los fundamentos del lenguaje Java hemos tratado ya de los identificadores. El cdigo debe de ser tanto ms fcil de leer y de entender como sea posible. Alguien que lea el cdigo, incluso despus de cierto tiempo, debe ser capaz de entender lo que hace a primera vista, aunque los detalles internos, es decir, cmo lo hace, precise un estudio detallado. Vemos primero un ejemplo que muestra un cdigo poco legible y por tanto, muy difcil de mantener public class Cuen { private int ba; Cuen(int ba) { this.ba=ba; { ba+=i; } } public void dep(int i)

public boolean ret(int i) { if(ba>=i) { } return false; }


Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 53

ba-=i;

return true;

Autor: Mg. Ing. Javier Martnez Carrin

public int get() { return ba; } Las abreviaciones empleadas solamente tienen significado para el programador en el momento de escribir el cdigo, ya que puede olvidarse de su significado con el tiempo. Otros programadores del grupo tienen que descifrar el significado del nombre de cada variable o de cada funcin. El tiempo extra que se gasta en escribir con claridad el nombre de los diversos elementos que entran en el programa, se ahorra ms adelante durante su desarrollo, depuracin, y mejora, es decir, durante todo el ciclo de vida del programa. 9. METODOS 9.1 DEFINICION Los mdulos en JAVA se llaman mtodos y clases. Los programas en JAVA se escriben combinando mtodos nuevos que el programador escribe con mtodos preempacados disponibles en la Java API (Tambin conocida como la biblioteca de clases de Java) y combinando clases nuevas que el programador escribe con clases preempacados disponibles en diversas bibliotecas de clases. El programador puede escribe mtodos para definir tareas especficas que se pueden utilizar en muchos puntos de un programa. Estos se conocen como mtodos definidos por el programador. Los enunciados reales que definen el mtodo se escriben una sola vez y quedan ocultos en los dems mtodos. Un mtodo se invoca con una llamada de mtodo. Dicha llamada especfica el nombre del mtodo y proporcionan la informacin (en forma de argumentos o parmetros) que el mtodo necesita para hacer su trabajo. Los mtodos permiten al programador modularizar sus programas. Todas las variables declaradas en las definiciones de mtodos son variables locales: solo se conocen en el mtodo que se definen. Casi todos los mtodos tienen una lista de parmetros que permiten comunicar informacin entre mtodos. Los parmetros de un mtodo tambin son variables locales. Java API ofrece una rica coleccin de clases y mtodos para realizar clculos Ejemplo: matemticos comunes, manipular cadenas, manipular caracteres y muchas otras operaciones tiles. }

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 54

Autor: Mg. Ing. Javier Martnez Carrin

Implemente un mtodo que reciba como parmetro un nmero entero y determine si es primo o compuesto. Un nmero primo es aquel que solo es divisible (Con resto cero) entre la unidad y entre si mismo. import java.io.* public class NumeroPrimo { public static void main(String arg[ ]) trhows IOException { int x; BufferedReader sdtin = new BufferedReader(new InputStreamReader(System.in)); System.out.println( \t + Determinar Nmeros Primos" + \n ); System.out.println( Ingrese un Nmero : ); x=Integer.parseInt(sdtin.readLine()); primo (x); } public static void primo(int y) { int z=0; for(int i=1; i<=y; i++) { if(y%i ==0) { z++; } } if(z==2) { +z); } else { +z); } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 55

System.out.println( \n + El Nmero es Primo :

System.out.println( \n + El Nmero No es Primo :

Autor: Mg. Ing. Javier Martnez Carrin

El ejemplo anterior usa el mtodo primo, invocado desde el mtodo main, para determinar si un nmero ingresado por teclado es primo o no. El mtodo primo se invoca o llama en main con la llamada: primo ( x); El mtodo primo recibe una copia del valor x en el parmetro y. Luego primo va contabilizando el nmero de divisores que puede tener el parmetro y (mediante la variable local z), luego evalua el valor de z y emite un mensaje en funcin de ese valor. La definicin del mtodo primo muestra que espera un parmetro entero y. La palabra clave void que precede al nombre del mtodo indica que ste no devuelve ningun resultado. Debe observarse que la definicin completa del mtodo esta contenida entre las llaves de la clase NumeroPrimo. En Java, todos los mtodos deben definirse dentro de una definicin de clase. El formato de defincin de mtodo es: Tipo_de_valor_devuelto nombre_de_mtodo(lista_de_parmetros) { Declaraciones y enunciados } El nombre_de_mtodo es cualquier identificador vlido. El Tipo_de_valor_devuelto es el tipo de datos del resultado que el mtodo devuelve al invocador. La lista_de_parmetros es una lista separada por comas que contiene las declaraciones de los parmetros que el mtodo recibe cuando se le invoca, puede darse el caso que el mtodo no reciba parmetros(se coloca un juego de parntesis vaco despues del nombre del mtodo). Se debe listar explcitamente un tipo para cada parmetro de la lista de parmetros del mtodo. Ejemplo: Implemente un mtodo que acepte un nmero entero positivo y determine si es nmero perfecto. Un nmero es perfecto si la suma de sus divisores es igual al mismo nmero. import java.io.* public class NumeroPerfecto { public static void main(String arg[ ]) trhows IOException {
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 56

Autor: Mg. Ing. Javier Martnez Carrin

int x; BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in)); System.out.println( \t + NUMEROS PERFECTOS" + \n ); do{ System.out.println( Ingrese un Nmero Positivo: ); x=Integer.parseInt(stdin.readLine()); } while(x<0); perfecto(x); } public static void perfecto(int x) { int suma=0; for(int i=1; i<x; i++) { if(x%i ==0) { suma = suma + i; } } if(suma ==x) System.out.println( \n + El Nmero es Perfecto + \n ); else Perfecto + \n ); } } 10.- MTODOS DE LA CLASE MATH Los mtodos de la clase Math permiten al programador realizar ciertos clculos matemticos comunes. Algunos de estos mtodos se resumen en la siguiente tabla: en ella las variables x e y son de tipo double. Mtodo abs( x ) Descripcin Valor absoluto de x. valores float, int y long. Ejemplo Si x>0; abs( x ) es Si x=0; abs( x ) es 0 Si x<0; abs( x ) es
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 57

System.out.println( \n + El Nmero no es

Este mtodo tambin tiene versiones para x

Autor: Mg. Ing. Javier Martnez Carrin

ceil( x ) cos( x ) exp( x )

Redondea x al entero ms pequeo no ceil( 9.2 ) es 10 menor que x. Coseno trigonomtric de x (x en radianes) Mtodo exponencial ex ceil( -9.8 ) es -9 cos (0.0) es 1 exp (1.0) es 2.71828 exp (2.0) es 7.38906 Redondea x al entero ms grande no floor(9.2) es 9 mayor que x Logaritmo natural de x (base e) Valor mayor de x e y valores float, int y long. floor(-9.8) es -10 log(2.71828) es 1 log(7.389056 es 2 max(2.3,12.7) es max(-2.3,-12.7) es -2.3 min(2.3,12.7) min(-2.3,-12.7)
y

floor( x ) lg( x ) max( x, y )

Este mtodo tambin tiene versiones para 12.7

min( x, y )

Valor menor de x e y valores float, int y long.

es es

Este mtodo tambin tiene versiones para 2.3 -12.7 pow(2,7) es 128 pow(9,0.5) es 3 sin (0.0) es 0 sqrt(900.0) es 30 sqrt(9.0) es 3 en tan(0.0) es 0

pow( x, y ) Sin( x ) Sqrt( x ) tan( x )

X elevado a la potencia y (x ) Seno trigonomtric de x (x en radianes) Raz cuadrada de x Tangente radianes) trigonomtrica de x(x

La clase Math tambin tiene dos constantes matemticas de uso comn: Math.PI y Math.E. La constante Math.PI(3.14159265358979323846) es la razn entre la circunferencia de un crculo y su dimetro. La constante Math.E(2.7182818284590452354) es el valor de la base de los logaritmos naturales (Que se obtienen con el mtodo Math.log). Una de las grandes ventajas de Java es el gran nmero de clases contenidas en los paquetes de la Java API que los programadores pueden utilizar en lugar de volver a intentar la rueda. La siguiente tabla lista los paquetes de la Java API.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 58

Autor: Mg. Ing. Javier Martnez Carrin

Paquete de Java java.applet

Descripcin El paquete de Applet de Java (Java Applet Package). Contiene la clase Applet y varias interfaces que permiten la creacin de applets, la interaccin de los applets con el navegador y la reproduccin de clips de audio. El paquete de herramientas abstractas para trabajar con ventanas de Java (Java Abstract Windowing Toolkit Package). Contiene todas las clases e interfaces necesarias

java.awt

java.awt.image

para crear y manipular interfaces grficas con el usuario. El paquete de imgenes de las herramientas abstractas para trabajar con ventanas de Java(Java Abstract Windowing Toolkit Image Package). Contiene clases e interfaces que permiten almacenar y manipular imgenes en un programa. El paquete de pares de las herramientas abstractas para trabajar con ventanas de Java(Java Abstract Windowing Toolkit Package). Contiene interfaces que permiten a los componentes de interfaz grfica con el usuario de Java interactuar con sus versiones en plataformas especficas(por ejemplo, un boton se implementa de forma diferente en cada plataforma de computadora, por lo que su par(peer) se utiliza para realmente exhibir y manipular el botn de una forma especfica para cada plataforma. El paquete de entrada / salida de Java (Java Input / Ouput Package). Contiene clases que permiten a los programas introducir y producir datos. El paquete del Lenguaje Java (Java Language Package). El compilador importa automticamente este paquete en todos los programas. Contiene las clases e interfaces bsicas requeridas por la mayora de programas en Java. El paquete de trabajo con Redes de Java (Java Networking Package). Contiene clases que permiten a los programas comunicarse a travs de la Internet o de Intranets corporativas.

java.awt.peer

java.io

java.lang

java.net

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 59

Autor: Mg. Ing. Javier Martnez Carrin

java.until

El paquete del utilidades de Java (Java Utilities Package). Contiene clases de e interfaces fechas y de horas utuilidad (Date), como: diversas manipulaciones

capacidades de procesamiento de nmeros aleatorios (random), almacenamiento y procesamiento de grandes cantidades de datos, etc. Java API ofrece una rica coleccin de clases y mtodos para realizar clculos matemticos comunes, manipular cadenas, manipular caracteres y muchas otras operaciones tiles. Generacin de nmeros aleatorios El mtodo random (aleatorio) de la clase Math genera un valor double entre 0.0 y 1.0 (sin incluir ste ltimo valor). Dado que random produce valores al azar, todos los valores del intervalo tienen la misma oportunidad (o probabilidad) de ser escogidos cada vez que se invoca a random.

DESARROLLO DE PROGRAMAS EJEMPLOS


TEMAS: METODOS

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 60

Autor: Mg. Ing. Javier Martnez Carrin

1.

/* Implemente un mtodo que reciba como parmetro un nmero entero y determine si este nmero es primo o compuesto. Un nmero primo es aquel que solo es divisible (Con resto cero) entre la unidad y entre si mismo. */ package ejercicio010; import java.io.*; public class ejemplo010 { public static void main(String arg[]) throws IOException { int x; BufferedReader sdtin = new BufferedReader(new

InputStreamReader(System.in)); System.out.println('\t' + "Determinar Nmeros Primos" +'\n'); System.out.println("Ingrese un Nmero : "); x=Integer.parseInt(sdtin.readLine()); primo(x); } public static void primo(int y) { int cde=0; for(int i=1; i<=y; i++) { if(y%i ==0) { cde++; } } if(cde==2) System.out.println('\n' + "El Nmero es Primo" + '\n'); else } } System.out.println('\n' + "El Nmero no es Primo" + '\n');

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 61

Autor: Mg. Ing. Javier Martnez Carrin

2.

/* Implemente un mtodo que acepte un nmero entero positivo y determine si este nmero, es nmero perfecto o no. Un nmero es perfecto si la suma de sus divisores es igual al mismo nmero. */ package ejercicio011; import java.io.*; public class ejemplo011 { public static void main(String arg[ ]) throws IOException { int x; BufferedReader stdin = new BufferedReader(new

InputStreamReader(System.in)); System.out.println( '\t' + "NUMEROS PERFECTOS"+ '\n'); do{ System.out.println("Ingrese un Nmero Positivo: "); x=Integer.parseInt(stdin.readLine()); } while(x<0); perfecto(x); } public static void perfecto(int x) { int suma=0; for(int i=1; i<x; i++) { if(x%i ==0) { suma = suma + i; } } if(suma ==x) { System.out.println('\n' + "El Nmero es Perfecto" + '\n'); } else { System.out.println('\n' + "El Nmero no es Perfecto" + '\n'); } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 62

Autor: Mg. Ing. Javier Martnez Carrin

DESARROLLO DE PROGRAMAS EJEMPLOS


TEMAS: CLASES Y OBJETOS TEMAS: CREACIN DE OBJETOS CONSTRUCTORES

1.- Se desea leer las calificaciones (Validar las calificaciones entre 0 y 20), de una clase de Informtica de N alumnos (Validar N, entre 1 y 10) y contar el nmero total de aprobados (11 o mayor que 11) y de desaprobados (10 o menor que 10). package notas01; import java.io.*; public class NOTAS01 Principal) { public static void main(String[] args) throws IOException { int i,n,cal; PROCESOS o1=new PROCESOS(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); do{ System.out.println("Ingrese Cantidad de Calificaciones: "); n=Integer.parseInt(br.readLine()); }while(n<1 || n>10); for(i=0;i<n;i++) { do{ System.out.println("Ingrese La Calificacin: "); cal=Integer.parseInt(br.readLine()); }while(cal<0 || cal>20);
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 63

// Mtodo Principal (Clase

Autor: Mg. Ing. Javier Martnez Carrin

o1.notasmuym(cal); o1.notasmala(cal); o1.notasregu(cal); o1.notasbuen(cal); o1.notasexce(cal); } System.out.println("REPORTE DE RESULTADOS GENERALES"); System.out.println("Total de notas consideradas Muy Malas : "+o1.repormuym()); System.out.println("Total de notas consideradas como Malas : "+o1.repormala()); System.out.println("Total de notas consideradas Regulares : "+o1.reporregu()); System.out.println("Total de notas consideradas como Buenas: "+o1.reporbuen()); System.out.println("Total de notas consideradas Excelentes : "+o1.reporexce()); } }

package notas01; public class PROCESOS Clase de Procesos { double ccc=0,csd=0,cot=0,ccd=0,cdv=0; void notasmuym(int cal) { if(cal>0 && cal<6) } void notasmala(int cal) { if(cal>5 && cal<11) }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 64

//Mtodo Secundario o

ccc++;

csd++;

Autor: Mg. Ing. Javier Martnez Carrin

void notasregu(int cal) { if(cal>10 && cal<14) } void notasbuen(int cal) { if(cal>13 && cal<18) } void notasexce(int cal) { if(cal>17 && cal<21) } double repormuym() { return ccc++; } double repormala() { return csd++; } double reporregu() { return cot++; } double reporbuen() { return ccd++; } double reporexce() { return cdv++; } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 65

cot++;

ccd++;

cdv++;

Autor: Mg. Ing. Javier Martnez Carrin

2.- Leer las N notas de una clase de Informtica y deducir todas aquellas que son: Muy Malas : Malas Buenas Excelentes : : Regulares : Entre 0 y 5 Entre 6 y 10 Entre 11 y 13 : Entre 14 y 17 Entre 18 y 20

Calcular y Reportar los siguientes resultados: - Promedio general de notas. - Reporte de cuantas notas por cada categora se obtuvo. - Nota mayor de toda la clase. package calificaciones; import java.io.*; public class Problema01 { public static void main(String[] args) throws IOException { int n,i,cal; PROCESOS o1=new PROCESOS(); BufferedReader br = new BufferedReader (new InputStreamReader(System.in)); do{ System.out.println("Ingrese el numero de alumnos:"); n=Integer.parseInt(br.readLine()); }while(n<1 || n>10); for(i=0;i<n;i++) { do{ System.out.println("Ingrese la nota del alumno:"); cal=Integer.parseInt(br.readLine()); }while (cal<0 || cal>20); o1.apro(cal); } System.out.println("El numero de aprobados es:"+o1.reporapro());
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 66

Autor: Mg. Ing. Javier Martnez Carrin

} }

package calificaciones; public class PROCESOS { double cap=0; void apro(int cal) { if(cal>10 && cal<20) cap++; } double reporapro() { return cap; } } 3.- Elaborar una aplicacin Java que registre informacin bsica de un empleado. Implemente acciones de ingreso de datos, listar y aumento de sueldo. package sueldos; import java.io.*; class Empleado { int codi; String nomb, apell; double sbas; void asigna(int c, String n, String a, double s) { codi=c; nomb=n; apell=a; sbas=s; }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 67

Autor: Mg. Ing. Javier Martnez Carrin

void aumenta(double au) { sbas=sbas+au; } String getapell() { return apell; } double getsbas() { } public class TestEmpleado { public static void main(String []args) throws IOException { int n; String t1,t2,temp; double su; Empleado e1; e1=new Empleado(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese Codigo "); temp=br.readLine(); n=Integer.parseInt(temp); System.out.println("Ingrese Nombres "); System.out.println("Ingrese Apellidos "); System.out.println("Ingrese Sueldo "); su=Double.parseDouble(temp); e1.asigna(n,t1,t2,su); System.out.println("Apellidos "+e1.getapell()); System.out.println("Sueldo "+e1.getsbas()); e1.aumenta(200); System.out.println("\nApellidos "+e1.getapell());
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 68

return sbas;

// Clase Principal

t1=br.readLine(); t2=br.readLine(); temp=br.readLine();

Autor: Mg. Ing. Javier Martnez Carrin

System.out.println("Sueldo "+e1.getsbas()); } }

4.

Elaborar una aplicacin Java que registre informacin bsica de dos empleados. Implemente acciones de ingreso de datos, listar y homologa (permite igualar ambos sueldos). Utilice constructores. package empleados; import java.io.*; class Empleado { int codi; String nomb, apell; double sbas; Empleado(int c, String n, String a, double s) { codi=c; nomb=n; apell=a; sbas=s; } void aumenta(double au) { sbas=sbas+au; } String getapell() { return apell; } double getsbas() { return sbas; }

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 69

Autor: Mg. Ing. Javier Martnez Carrin

void homologa(Empleado y) { if(sbas>y.sbas) { y.sbas=sbas; } else { sbas=y.sbas; } } }

public class TestEmpleado { public static void main(String []args) throws IOException { int n; String t1,t2,temp; double su; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese Codigo "); temp=br.readLine(); n=Integer.parseInt(temp); System.out.println("Ingrese Nombres "); t1=br.readLine(); System.out.println("Ingrese Apellidos "); t2=br.readLine(); System.out.println("Ingrese Sueldo "); temp=br.readLine(); su=Double.parseDouble(temp); Empleado e1,e2; e1=new Empleado(n,t1,t2,su); System.out.println("Apellidos 1: "+e1.getapell()); System.out.println("Sueldo 1: "+e1.getsbas()); e2=new Empleado(432,"Juan","Perez",670); System.out.println("\n Apellidos 2: "+e2.getapell()); System.out.println("Sueldo 2: "+e2.getsbas());
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 70

Autor: Mg. Ing. Javier Martnez Carrin

e1.homologa(e2); System.out.println("\nApellidos 1: "+e1.getapell()); System.out.println("Sueldo 1: "+e1.getsbas()); System.out.println("\nApellidos 2: "+e2.getapell()); System.out.println("Sueldo 2: "+e2.getsbas()); } }

5.- Elaborar una aplicacin Java para procesar informacin de un artculo. Considere atributos como Cdigo, descripcin, Stock, precio de compra y precio de venta. Elabore los mtodos para ingresar datos, listar, aumentar el precio de venta en 10 % y disminuir el stock en 3 unidades. package articulos; package Articulo; public class Articulo { int codigo,stock; String descripcion; double pcompra,pventa; void ingreso(int c, String d, int s, double pc) { codigo=c; descripcion=d; stock=s; pcompra=pc; } int getCodigo() { return codigo; } int getStock() { return stock; } String getDescripcion()
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 71

Autor: Mg. Ing. Javier Martnez Carrin

{ return descripcion; } double getPCompra() { return pcompra; } void aumentaPventa(double pcompra) { pventa=pcompra+(pcompra*0.10); } double getPVenta() { return pventa; } void disminuyeStock(double stoc) { stock=stock - 3; } } package Articulo; import java.io.*; public class PrinArticulo { public static void main(String []args) throws IOException { int codigo,stock; String descripcion,temp; double pcompra,pventa; Articulo a1=new Articulo(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 72

Autor: Mg. Ing. Javier Martnez Carrin

System.out.println("Ingrese Codigo "); temp=br.readLine(); codigo=Integer.parseInt(temp); System.out.println("Ingrese Stock "); temp=br.readLine(); stock=Integer.parseInt(temp); System.out.println("Ingrese Descripcion "); descripcion=br.readLine(); System.out.println("Ingrese Precio Compra "); temp=br.readLine(); pcompra=Double.parseDouble(temp); a1.ingreso(codigo,descripcion,stock,pcompra); a1.disminuyeStock(stock); a1.aumentaPventa(pcompra); System.out.println("Cdigo: "+a1.getCodigo()); System.out.println("Descripcion: "+a1.getDescripcion()); System.out.println("\nStock: "+a1.getStock()); System.out.println("Precio de Compra: "+a1.getPCompra()); System.out.println("Precio de Venta: "+a1.getPVenta()); } }

6.- Elaborar una aplicacin en Java que contenga la clase fraccion que denote atributos y funciones para operar nmeros fraccionarios. Implementar los mtodos de: Ingreso Listado Suma de dos fracciones Producto de dos fracciones Utilice fundamento de constructores con parmetros.*/ package Fraccion; import java.io.*;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 73

Autor: Mg. Ing. Javier Martnez Carrin

import java.awt.*; import java.awt.event.*; public class Frac { private int a,b,c,d; public Frac() { a=0; b=0; c=0; d=0; } public void seddatos(int a1,int b1, int c1, int d1) { a=a1; b=b1; c=c1; d=d1; } public float suma(Frac f) { float sum= ((a*d)+(b*c))/(d*b); return sum; } public float producto(Frac f) { float pro=(a*c)/(b*d); return pro; } } package Fraccion; import java.io.*; public class Proyecto_Frac { public static void main(String[]args) throws IOException
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 74

Autor: Mg. Ing. Javier Martnez Carrin

{ String temp; int aa,bb,cc,dd; BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); Frac fr1=new Frac(); Frac fr2=new Frac(); Frac fr3=new Frac(); //(a/b)+(c/d) //(a/b)*(c/d) System.out.println("Ingese el numerador a...."); aa=Integer.parseInt(br.readLine()); System.out.println("Ingese el denominador b...."); bb=Integer.parseInt(br.readLine()); System.out.println("Ingese el numerador c...."); cc=Integer.parseInt(br.readLine()); System.out.println("Ingese el denominador d...."); dd=Integer.parseInt(br.readLine()); fr1.seddatos(aa,bb,cc,dd); float asum=fr1.suma(fr2); System.out.println("Suma de fracciones..."+asum); float apro=fr1.producto(fr3); System.out.println("producto de fracciones...."+apro); } }

7.-

Programa que calcula el MCD y MCM de 2 nmeros. package Multiplo; import java.io.*;

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 75

Autor: Mg. Ing. Javier Martnez Carrin

public class Principal { public static void main(String []args) throws IOException { int a,b; String temp; Proceso p=new Proceso(); BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese Numero 1:"); a=Integer.parseInt(br.readLine()); System.out.println("Ingrese Numero 2: "); b=Integer.parseInt(br.readLine()); p.ingreso(a,b); System.out.println("LISTADOS"); System.out.println("PRIMER NUMERO:"+p.listanumero1()); System.out.println("SEGUNDO NUMERO:"+p.listanumero2()); System.out.println("REPORTE DE RESULTADOS"); System.out.println("El MCD es:"+p.p_mcd()); System.out.println("El MCM es:"+p.p_mcm()); } } package Multiplo; public class Proceso { int a,b; int pro; public Proceso() { a=0; b=0; } public Proceso(int xa, int xb) //Sobrecarga de constructor {
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 76

//Directo

//Datos miembros globales

//Constructor //inicializaciones

Autor: Mg. Ing. Javier Martnez Carrin

a=xa; b=xb; } public void ingreso(int ya, int yb) //Asignacion de datos de ingreso { a=ya; b=yb; } public int listanumero1() { return a; } public int listanumero2() { return b; } public double p_mcd() { pro=a*b; while(a!=b) { if(a>b) { a=a-b; } else { b=b-a; } } return a; } public double p_mcm() { int mcm; mcm=pro/a; return mcm; } } //Metodo de ingreso

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 77

Autor: Mg. Ing. Javier Martnez Carrin

8.- Elaborar una aplicacin en Java que denote la clase Punto, que represente a un punto geomtrico en el plano cartesiano. Elaborar un men de opciones con las siguientes funciones: 1. 2. 3. 4. 5. 6. Ingreso de datos Listado Pendiente (dos puntos) Distancia (dos puntos) Colineales (tres puntos) Salir

package Punto; import java.io.*; import java.awt.event.*; import java.awt.*; public class Punto { private int x,y; public Punto() { x=0; y=0; } public Punto(int a, int b) { x=a; y=b; } public void setdatos(int c, int d) { x=c; y=d; } public int getx() { return x;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 78

Autor: Mg. Ing. Javier Martnez Carrin

} public int gety() { } public double pendiente(Punto b) { double pend=(y-b.y)/(x-b.x); return pend; } public double distancia(Punto b) { double dist=Math.sqrt(Math.pow((y-b.y),2)+Math.pow((x-b.x),2)); return dist; } public boolean condicion(Punto b) { if(getx()==b.getx() && gety()==b.gety()) { return true; } return false; } } return y;

package Punto; import java.io.*; public class TestPunto { public static void main(String[]args) throws IOException { String temp; int a,b;

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 79

Autor: Mg. Ing. Javier Martnez Carrin

BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); Punto p1=new Punto(3,4); System.out.println("Ingrese Valor 1---->"); a=Integer.parseInt(br.readLine()); System.out.println("Ingrese Valor 2---->"); b=Integer.parseInt(br.readLine()); Punto p2=new Punto(); p2.setdatos(a,b); Punto p3=new Punto(); double xpend=p1.pendiente(p2); System.out.println("La pendiente de los puntos p1 y p2 = "+xpend); double xdist=p2.distancia(p3); System.out.println("la distancia de los puntos p2 y p3 = "+xdist); if(p1.condicion(p2)==true) { System.out.println("puntos con cordenadas iguales"); } } }

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 80

Autor: Mg. Ing. Javier Martnez Carrin

LABORATORIO N 03
TEMAS: METODOS TEMAS: CREACIN DE OBJETOS CONSTRUCTORES

1. Implemente un mtodo que reciba como parmetro un nmero entero y determine si es primo o compuesto. Un nmero primo es aquel que solo es divisible (Con resto cero) entre la unidad y entre si mismo. 2. Implemente un mtodo que acepte un nmero entero positivo y determine si es nmero perfecto. Un nmero es perfecto si la suma de sus divisores es igual al mismo nmero. 3. Implemente un mtodo que acepte como parmetro un ao y determine si es bisiesto o no. Implemente el mtodo main que invoque dicho mtodo. 4. Hacer un programa que Implemente un mtodo que reciba como parmetro un nmero y devuelva su factorial. No existe factorial de nmeros negativos. . Para probar la funcin o mtodo main pasar como argumento los 10 primeros nmeros naturales. 5. Hacer un programa que simule 20 lanzamientos de un dado de seis caras e imprimir el valor de cada tirada. 6. Implemente un mtodo que acepte como parmetro la hora minuto y segundo y muestre el siguiente segundo. Implemente el mtodo main que invoque dicho mtodo. 7. Implemente un mtodo que acepte como parmetro dos nmeros enteros positivos y determine el mximo comn divisor y el mnimo comn mltpilo.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 81

Autor: Mg. Ing. Javier Martnez Carrin

Chimbote, Mayo del 2009 LABORATORIO N 04


RELACION DE PROGRAMAS PROPUESTOS PARA TODO EL CURSO

1.-

Se desea leer las calificaciones (Validar las calificaciones entre 0 y 20), de una clase de Informtica de N alumnos (Validar N, entre 1 y 10) y contar el nmero total de aprobados (11 o mayor que 11) y de desaprobados (10 o menor que 10).

2.son:

Leer las N notas de una clase de Informtica y deducir todas aquellas que Muy Malas : Malas Regulares : Buenas Excelentes : Entre 0 y 5 : Entre 6 y 10

Entre 11 y 13 : Entre 14 y 17

Entre 18 y 20

Calcular y Reportar los siguientes resultados: Promedio general de notas. Reporte de cuantas notas por cada categora se obtuvo. Nota mayor de toda la clase. 3.Un comercio dispone de dos tipos de artculos en fichas correspondientes a diversas sucursales con lo siguientes campos:
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 82

Autor: Mg. Ing. Javier Martnez Carrin

Cdigo del articulo A o B Precio unitario del artculo Numero de artculos El numero de artculos existentes de cada categora El costo total de los artculos de cada categora. 4.En un Banco los intereses a pagar dependen del plazo al que se efecta el prstamo. Si es a 24 meses, se paga 12% de inters anual, si es a 18 meses el 10%, a 12 meses el 9%, a 6 meses el 8% y a 3 meses el 6%. Ingrese cuanto dinero y el plazo al que se realiza el prstamo y determine el inters anual a pagarse 5.Se tiene un Capital C que esta situado a un tipo de inters R (Los cuales debern de ser ingresados). Si se sabe que el Monto ser igual al Capital ms el inters. Verificar para 5 clientes, es decir para 5 personas, lo siguiente: El mayor Monto obtenido. Promedio de todos los montos El menor monto obtenido 6.Una estacin climtica proporciona un par de temperaturas diarias (mxima, mnima) (no es posible que alguna o ambas temperaturas sea 0 grados). La pareja fin de temperaturas es 0,0. Se pide determinar el numero de das cuyas temperaturas se han proporcionado, las medias mxima y mnima, el numero de errores temperaturas de 0 y el porcentaje que representa */ 7.Crear un algoritmo y programa respectivo que permita leer una fecha de nacimiento de una persona. Luego nos indique el tiempo de vida (expresado en das) de dicha persona hasta la fecha 31/08/2008 8.Calcular y Reportar si dados 2 nmeros ledos del teclado, uno es divisor del otro, comprobar para 5 pares de nmeros.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 83

Autor: Mg. Ing. Javier Martnez Carrin

9.-

Dada la edad de una persona determine y reportar en que etapa del desarrollo se encuentra, desarrolla para N personas.

10.- Se pretende listar todos los empleados de una empresa situados en un archivo EMPRESA y a la terminacin de la lectura del archivo se debe visualizar un mensaje "Existen trabajadores mayores de 65 aos en un numero de....." y el numero de trabajadores mayores de 65 aos. 11.- Se desea conocer una serie de datos de una empresa con 50 empleados a) Cuantos empleados ganan ms de 10,000 soles al mes (salarios altos) b) Entre 10,000 y 3,000 soles (salarios medios), y c) Menos de 3,000 soles (salarios bajos y empleados a tiempo parcial) 12.- En una Universidad el examen tiene un puntaje mximo de 120 puntos y se han fijado los puntajes mnimos para el ingreso a una carrera profesional, de la siguiente manera: Carrera Profesional Sistemas Civil Industrial Agronoma Arquitectura Puntaje Mnimo 100 90 80 70 60

De acuerdo al puntaje obtenido por un alumno, determine la carrera a la que ingreso o de un mensaje indicado que no le alcanzo el puntaje para ingresar. Determine el proceso de admisin para 2000 alumnos. 13.- Determinar la media de una lista indefinida de nmeros positivos, terminados con un nmero negativo 14.- Dado el nombre de un mes y si el ao es o no bisiesto, deducir el nmero de das del mes. 15.- Imprimir todos los nmeros primos comprendidos entre 1 a 100 inclusive.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 84

Autor: Mg. Ing. Javier Martnez Carrin

16.- Dados una lista de nmeros positivos los cuales terminan cuando se ingresa un nmero negativo. Deber de calcular y Reportar lo siguiente: (Para todos los clculos no se debe de considerar el ltimo nmero negativo ingresado). La media general de todos los nmeros. Cuantos mltiplos de 7 existen. Producto de todos los nmeros que son de un dgito. Sumatoria de todos los nmeros de dos dgitos 17.- Leer 100 nmeros. Determinar la media de los nmeros positivos y la media de los nmeros negativos 18.- Ingresar un lista de N nmeros y determinar si es mltiplo de 3 y 5 pero no de 2 a la vez, si es verdad elevar a la potencia de 4, sino es verdad sacar la raz cuadrada y reportar en ambos casos. 19.- Dado un grupo de nmeros positivos n(>1) comprobar si es primo o compuesto. 20.- Calcular: Sx = 1 + x + x2/2! + x3/3! + ........ + xn/n! para n>0 a) Para n dado 21.- Imprimir una tabla de multiplicar como: 1 ** 1* 2* 3* 4* .. .. .. 15* 15 30 45 60 ...... 225 1 2 3 4 2 ** 2 4 6 8 3 ** 3 6 9 12 4 ** 4 8 12 16 ...... ...... ...... ...... ...... 15 ** 15 30 45 60

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 85

Autor: Mg. Ing. Javier Martnez Carrin

22.- Se introduce una hora determinada del da (hh: mm: ss). Luego deber escribir la hora horas dadas. 23.- Los empleados de una fbrica trabajan en 2 turnos, diurno y nocturno. Se desea calcular el jornal diario de acuerdo con los siguientes puntos: 1. La tarifa de las horas diurnas es de 20 soles. 2. La tarifa de las horas nocturnas es de 25 soles. 3. Caso de ser Domingo la tarifa se incrementar en 50 soles el turno diurno y 100 soles el turno nocturno. 24.- En la garita de Peaje de la entrada de la ciudad (Lugar donde se cobra un monto de dinero a los vehculos). Se tiene previsto los siguientes montos por cada vehculo que circula por la misma. Si el vehculo cuenta con 2 ejes (Hasta 2). Debe de realizar un pago de 7.50 por cada eje. Si el vehculo cuenta con 3 ejes hasta 4. Debe de realizar un pago de 5.00 por cada eje. Si el vehculo cuenta con 5 ejes hasta 7. Debe de realizar un pago de 3.50 por cada eje. Si el vehculo cuenta con ms de 7 ejes. Debe de realizar un pago de 2.00 por cada eje. Calcula y Reporta el monto total a pagar por el paso de N vehculos por dicha garita. 25.- La siguiente tabla muestra el costo por da de alojamiento en un hotel, segn el tipo de cuarto que se elija: Tipo Costo por da S/. 1 50 2 75 3 100 4 80 5 150 correspondiente al siguiente segundo. Es decir la salida debe de indicar en el mismo formato (hh: mm: ss). Comprobar para N

Adems si se permanece ms de 5 das el hotel ofrece un descuento del 10% por los das adicionales de los cuartos de tipos 1, 2 o 4 y 20% en los tipos 3 o 5. Escriba un programa que lea el numero de das, y el tipo de cuarto y calcule el costo total.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 86

Autor: Mg. Ing. Javier Martnez Carrin

Chimbote, Mayo del 2009


11.-COMPONENTES SWING 11.1DEFINICIN: Cuando se empieza a utilizar Swing, se observa que JavaSoft ha dado un gran paso adelante respecto al AWT. Ahora los Componentes del interfaz grfico son Beans y utilizan el nuevo modelo de Delegacin de Eventos de Java. Swing proporciona un conjunto completo de Componentes, todos ellos lightweight, es decir, ya no se usan componentes "peer" dependientes del sistema operativo, y adems, Swing est totalmente escrito en Java. Todo ello redunda en una mayor funcionalidad en manos del programador, y en la posibilidad de mejorar en gran medida la cosmtica de los interfaces grficos de usuario. Son muchas las ventajas que ofrece el uso de Swing. Por ejemplo, la navegacin con el teclado es automtica, cualquier aplicacin Swing se puede utilizar sin ratn, sin tener que escribir ni una lnea de cdigo adicional. Las etiquetas de informacin, o "tool tips", se pueden crear con una sola lnea de cdigo. Adems, Swing aprovecha la circunstancia de que sus Componentes no estn renderizados sobre la pantalla por el sistema operativo para soportar lo que llaman "pluggable look and feel", es decir, que la apariencia de la aplicacin se adapta dinmicamente al sistema operativo y plataforma en que est corriendo. El paso de AWT a Swing es muy sencillo y no hay que descartar nada de lo que se haya hecho con el AWT. Afortunadamente, los programadores de Swing han tenido compasin y, en la mayora de los casos es suficiente con aadir una "J" al componente AWT para que se convierta en un componente Swing. Es muy importante entender y asimilar el hecho de que Swing es una extensin del AWT, y no un sustituto encaminado a reemplazarlo. Aunque esto sea verdad en algunos casos en que los componentes de Swing se corresponden a componentes del AWT; por ejemplo, el JButton de Swing puede considerarse como un sustituto del Button del AWT, y una vez que se usen los botones de Swing se puede tomar la decisin de no volver a utilizar jams un botn de AWT, pero, la funcionalidad bsica de Swing descansa sobre el AWT. Todo esto es para evitar que el lector salte directamente a Swing, ya que sera conveniente que primero entendiese el AWT y cmo Swing mejora al AWT. 11.2 INTRODUCCIN:
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 87

Autor: Mg. Ing. Javier Martnez Carrin

Para iniciar la entrada en Swing, qu mejor que implementar de nuevo otra versin del saludo inicial, pero con los componentes Swing, as que la versin del "Hola Mundo!", se convierte ahora en JHolaMundo.java, cuyo cdigo es el que sigue. import com.sun.java.swing.*; public class JHolaMundo extends JFrame { public static void main( String argv[] ) { new JHolaMundo(); } JHolaMundo() { JLabel hola = new JLabel( "Hola Mundo!" ); getContentPane().add( hola,"Center" ); setSize( 200,100); setVisible( true ); } } El siguiente ejemplo, java1401.java, aunque ya un poco ms en serio, tambin es muy sencillo y en l se pueden observar un poco mejor los cambios que introduce Swing, que son casi exclusivamente de nomenclatura. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1401 extends JPanel { JButton boton1 = new JButton( "JButton 1" ); JButton boton2 = new JButton( "JButton 2" ); JTextField texto = new JTextField( 20 ); public java1401() { ActionListener al = new ActionListener() { public void actionPerformed( ActionEvent evt ) { String nombre = ( (JButton)evt.getSource()).getText();
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 88

Autor: Mg. Ing. Javier Martnez Carrin

texto.setText( nombre+" Pulsado" ); } }; boton1.addActionListener( al ); boton1.setToolTipText( "Soy el JBoton 1" ); add( boton1 ); boton2.addActionListener( al ); boton2.setToolTipText( "Soy el JBoton 2" ); add( boton2 ); texto.setToolTipText( "Soy el JCampoDeTexto" ); add( texto ); } public static void main( String args[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } ); ventana.getContentPane().add( new java1401(),BorderLayout.CENTER ); ventana.setSize( 300,100 ); ventana.setVisible( true ); } } Si se excepta la nueva sentencia import, el resto del cdigo parece de AWT con una J delante de cada nombre de componente. Adems, no se puede aadir algo con add() a un JFrame, sino que hay que tener antes su contenido, tal como muestra tanto este ejemplo, como el anterior del saludo. Pero, vamos, con una simple conversin se tiene toda la potencia de Swing.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 89

Autor: Mg. Ing. Javier Martnez Carrin

Las dos imgenes anteriores corresponden a la captura de la ejecucin del ejemplo, en Solaris y en Windows, y ya se puede observar que el parecido con el AWT se va alterando un poco, a mejor por supuesto, debido a que se est utilizando un look, o apariencia grfica, diferente, en este caso el que JavaSoft llama Metal y que es el que por defecto se usa, aunque se puede tambin seleccionar el tipo de botones, cajas, textos, etc. con la apariencia de Window, Motif o Mac. BORDES: La clase JComponent tambin contiene un mtodo llamado setBorder(), que permite colocar diferentes bordes a un componente visible. El ejemplo java1402.java genera los diferentes tipos de borde que estn disponibles y que se reproducen en la figura siguiente.

Para generar la ventana anterior, el cdigo utiliza el mtodo creaBorde() que crea un JPanel y le coloca un borde diferente en cada caso y, adems, coloca el nombre del borde en medio del panel. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.border.*;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 90

Autor: Mg. Ing. Javier Martnez Carrin

public class java1402 extends JPanel { static JPanel creaBorde( Border b ) { JPanel panel = new JPanel(); String str = b.getClass().toString(); str = str.substring( str.lastIndexOf('.') + 1 ); panel.setLayout( new BorderLayout() ); panel.add(new JLabel( str,JLabel.CENTER ),BorderLayout.CENTER ); panel.setBorder( b ); return( panel ); } public java1402() { setLayout( new GridLayout( 2,4 ) ); add( creaBorde( new TitledBorder("Titulo") ) ); add( creaBorde( new EtchedBorder() ) ); add( creaBorde( new LineBorder(Color.blue) ) ); add( creaBorde( new MatteBorder(5,5,30,30,Color.green) ) ); add( creaBorde( new BevelBorder(BevelBorder.RAISED) ) ); add( creaBorde( new SoftBevelBorder(BevelBorder.LOWERED) ) ); add(creaBorde(new CompoundBorder( new EtchedBorder(),new LineBorder(Color.red) ) ) ); } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } }); frame.getContentPane().add( java1402(),BorderLayout.CENTER ); frame.setSize( 500,300 ); frame.setVisible( true ); } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 91

new

Autor: Mg. Ing. Javier Martnez Carrin

Muchos de los ejemplos que se desarrollarn usan el TitledBorder, pero el resto de los bordes son igual de fciles de utilizar. Tambin es posible crear bordes propios y colocarlos dentro de botones, etiquetas, etc.; virtualmente en cualquier cosa que derive de JComponent. ETIQUETAS: Las etiquetas, junto con los botones y las cajas de seleccin, son uno de los componentes ms bsicos de todo interfaz de usuario, independientemente de que se hayan visto otros hasta ahora, o el lector difiera de esta clasificacin. Y el ms simple de todos ellos es la etiqueta, que se limita a presentar textos en pantalla. Swing introduce la clase JLabel para presentar estos textos en pantalla; sin embargo, es mucho ms verstil que la clase correspondiente del AWT. En Swing, al derivar de JComponent, la clase JLabel implementa todas las caractersticas inherentes a los componentes Swing, como pueden ser los aceleradores de teclado, bordes, y dems. Si se echa un vistazo a los constructores de la clase JLabel, se puede observar claramente que Swing ofrece un API mucho ms rico, presentando constructores con habilidades no disponibles en el AWT. El ejemplo java1403.java, crea varias instancias de la clase JLabel utilizando algunas de las caractersticas que permite Swing, como por ejemplo la utilizacin de grficos, que resulta extremadamente simple. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; class java1403 extends JPanel { public java1403() { setLayout( new GridLayout( 2,2 ) ); JLabel etiq1 = new JLabel(); etiq1.setText( "Etiqueta1" ); add( etiq1 ); JLabel etiq2 = new JLabel( "Etiqueta2" ); etiq2.setFont( new Font( "Helvetica", Font.BOLD, 18 ) ); add( etiq2 ); Icon imagen = new ImageIcon( "star0.gif" );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 92

Autor: Mg. Ing. Javier Martnez Carrin

JLabel

etiq3

new

JLabel(

"Etiqueta3",

imagen,SwingConstants.CENTER ); etiq3.setVerticalTextPosition( SwingConstants.TOP ); add( etiq3 ); JLabel etiq4 = new JLabel( "Etiqueta4",SwingConstants.RIGHT ); add( etiq4 ); } public static void main( String args[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } ); ventana.getContentPane().add( java1403(),BorderLayout.CENTER ); ventana.setSize( 300,150 ); ventana.setVisible( true ); } } La figura siguiente es el resultado de la ejecucin del programa anterior, donde se puede observar que en la Etiqueta2 se muestra el cambio de fuente de caracteres y en la Etiqueta3 se incluye una imagen. En este ltimo caso, el tamao de la imagen es el que determina el tamao mnimo de la etiqueta. new

El tipo de letra con que se presenta el texto de la etiqueta se puede cambiar fcilmente, basta con crear una nueva fuente de caracteres e
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 93

Autor: Mg. Ing. Javier Martnez Carrin

invocar al mtodo setFont() de la clase JLabel para que el cambio surta efecto. La fuente de caracteres puede ser cualquiera de las estndar, dentro de los tamaos soportados por la mquina virtual Java de la plataforma. El control de la fuente de caracteres utilizada para la etiqueta se puede realizar con una lnea de cdigo semejante a la siguiente: label.setFont( new Font( "Dialog",Font.PLAIN,12 ) ); Los colores del texto y del fondo de la etiqueta tambin se pueden cambiar de forma muy sencilla, mediante la invocacin de los mtodos setForeground() y setBackground(). BOTONES: Swing aade varios tipos de botones y cambia la organizacin de la seleccin de componentes: todos los botones, cajas de seleccin, botones de seleccin y cualquier opcin de un men deben derivar de AbstractButton. El ejemplo java1404.java, muestra los diferentes tipos de botones que estn disponibles ante el programador a travs de Swing. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1404 extends JPanel { public java1404() { add( new JButton( "JButton" ) ); add( new JToggleButton( "JToggleButton") ); add( new JCheckBox( "JCheckBox" ) ); add( new JRadioButton( "JRadioButton" ) ); } public static void main( String args[] ) { java1404 panel = new java1404(); JFrame ventana = new JFrame(); ventana.getContentPane().add( panel,BorderLayout.CENTER ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 94

Autor: Mg. Ing. Javier Martnez Carrin

} } ); ventana.setSize( 300,200 ); ventana.setTitle( "Tutorial de Java, Swing" ); ventana.setVisible( true ); } } La figura siguiente corresponde a la captura de la ejecucin del programa anterior, y reproduce la apariencia de estos tipos de botones implementados por Swing.

El JButton parece igual que el botn que hay en el AWT, pero se pueden hacer muchas ms cosas con l. Todos los botones, adems, tienen ahora la posibilidad de incorporar imgenes a travs del objeto Icon, que se puede asignar a cualquier tipo de botn. E incluso se pueden asignar varios iconos a un mismo botn para visualizar los diferentes estados en que pueda encontrarse dicho botn, tal como muestra la figura siguiente que corresponde a la captura de la ejecucin del ejemplo java1405.java.

GRUPO DE BOTONES: Si se quieren botones de seleccin nica, los conocidos como botones radio, que tienen la particularidad de que solamente puede haber uno seleccionado, hay que crearse un grupo de botones, aadiendo botones a ese grupo uno a uno. Pero, Swing permite que cualquier AbstractButton pueda ser aadido a un ButtonGroup.La figura

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 95

Autor: Mg. Ing. Javier Martnez Carrin

siguiente

muestra

los

grupos

de

botones

con

la

apariencia

correspondiente a Swing, segn se obtiene la ventana tras la ejecucin del ejemplo java1406.java, que crea varios paneles de botones.

Para evitar la repeticin del cdigo correspondiente a la incorporacin de cada uno de los botones, en el ejemplo se utiliza la reflexin para generar los grupos de diferentes tipos de botones. Esto se puede ver en creaPanelBotones(), que crea un grupo de botones y un JPanel, y para cada String en el array que figura como segundo argumento de creaPanelBotones(), aade un objeto de la clase indicada por el primero de los argumentos. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.border.*; import java.lang.reflect.*; public class java1406 extends JPanel { static String ids[] = { "Mortadelo","Filemon","Carpanta", "Rompetechos","Pepe Gotera","Otilio", }; static JPanel creaPanelBotones( Class bClass,String ids[] ) { ButtonGroup botones = new ButtonGroup(); JPanel panel = new JPanel(); String titulo = bClass.getName();

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 96

Autor: Mg. Ing. Javier Martnez Carrin

titulo = titulo.substring( titulo.lastIndexOf('.')+1 ); panel.setBorder( new TitledBorder( titulo ) ); for( int i=0; i < ids.length; i++ ) { AbstractButton botonAbs = new JButton( "fallo" ); try { // Se utiliza el constructor dinmico al que se pasa // una cadena como argumento Constructor ctor = bClass.getConstructor( new Class[] { String.class } ); // Se crea un nuevo objeto del tipo del botn botonAbs = ( AbstractButton )ctor.newInstance( new Object[]{ ids[i] } ); } catch( Exception e ) { System.out.println( "No puedo crear " + bClass ); } botones.add( botonAbs ); panel.add( botonAbs ); } return( panel ); } public java1406() { add( creaPanelBotones( JButton.class,ids ) ); add( creaPanelBotones( JToggleButton.class,ids ) ); add( creaPanelBotones( JCheckBox.class,ids ) ); add( creaPanelBotones( JRadioButton.class,ids ) ); } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } }); frame.getContentPane().add( java1406(),BorderLayout.CENTER );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 97

new

Autor: Mg. Ing. Javier Martnez Carrin

frame.setSize( 600,300 ); frame.setVisible( true ); } } El ttulo se coge del nombre de la clase, eliminndole toda la informacin referente al camino en que se encuentra en disco. El AbstractButton es inicializado a un JButton que tiene la etiqueta "Fallo", para que si se ignora el mensaje de la excepcin, todava se pueda ver en la pantalla que hay problemas. El mtodo getConstructor() genera un objeto Constructor que coge el array de argumentos de tipos en el array Class pasado a getConstructor(). Y ya, todo lo que hay que hacer es llamar a newInstance(), pasarle un array de Object conteniendo los argumentos actuales; en este caso concreto, la cadena obtenida desde el array de ids. Ahora se aade un poco de complejidad a lo que antes era un proceso muy simple, para conseguir que funcione el grupo con un nico botn seleccionado. Hay que crear un grupo de botones e indicarle a cada uno de los botones de ese grupo cual es el comportamiento que se desea de l. Cuando se ejecute el programa, se observar que todos los botones, excepto el JButton, disponen de ese comportamiento de exclusividad, marcndose y desmarcndose automticamente, en funcin de la pulsacin del ratn sobre el botn. LISTAS Y CAJAS COMBINADAS: Las listas y cajas "combo" en Swing funcionan del mismo modo que lo hacan en el AWT, aunque tienen incrementada la funcionalidad a travs de algunas funciones de conveniencia que se han incorporado. Por ejemplo, JList tiene un constructor al que se puede pasar un array de objetos String para que los presente. El ejemplo java1407.java, muestra el uso bsico de estos dos componentes. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1407 extends JPanel { public java1407() { setLayout( new GridLayout( 2,1 ) );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 98

Autor: Mg. Ing. Javier Martnez Carrin

JList lista = new JList( java1406.ids ); add( new JScrollPane( lista ) ); JComboBox combo = new JComboBox(); for( int i=0; i < 100; i++ ) combo.addItem( Integer.toString( i ) ); add( combo ); } public static void main( String args[] ) { java1407 lista = new java1407(); JFrame ventana = new JFrame(); ventana.getContentPane().add( lista,BorderLayout.CENTER ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } } ); ventana.setSize( 200,200 ); ventana.setTitle( "Tutorial de Java, Swing" ); ventana.setVisible( true ); } } La imagen siguiente es el resultado que se obtiene en pantalla tras la ejecucin del ejemplo, y despus de haber seleccionado uno de los elementos en la caja combo y abrirla para proseguir la seleccin de otra de las opciones o elementos que se permite elegir.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 99

Autor: Mg. Ing. Javier Martnez Carrin

Una cosa que se ha mantenido con respecto a las listas de antes es que los objetos JList no proporcionan automticamente la posibilidad de scroll o desplazamiento del contenido, que es una cosa que se espera que haga automticamente, y resulta un poco chocante. No obstante, el aadir scroll a listas es sumamente sencillo, ya que es suficiente con incluir la JList en del un JScrollPane, sern y todos ya los detalles bajo del la desplazamiento contenido manejados

responsabilidad del sistema. Aunque lo ms frecuente es que cada elemento seleccionable de una lista sea una etiqueta, Swing proporciona al componente JList tambin la posibilidad de presentar grficos, con o sin texto asociado, y tambin proporciona un control adicional de eventos para adecuarse a los que se producen en la manipulacin de este tipo de Componentes. Es decir, que en una lista tambin se pueden incluir instancias de clases como JButton, JTextField, JCheckBox, e incluso JTextArea, que es un componente multilnea. Cada valor incluye el carcter de nueva lnea, \n, para forzar el salto de lnea en medio del texto. class MiRendererDeLista extends JTextArea implements ListCellRenderer { public Component getListCellRendererComponent( JList lista,Object valor,int indice, boolean seleccionado, boolean conFoco ) { setBorder( new BevelBorder( BevelBorder.RAISED ) );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 100

Autor: Mg. Ing. Javier Martnez Carrin

// Presenta el text correspondiente al item setText( valor.toString() ); // Pinta en los colores indicados y con la fuente seleccionada... if( seleccionado ) { // .. en el caso de un item marcado (rojo/blanco) setBackground( Color.red ); setForeground( Color.white ); } else { // .. en el caso de un item no marcado (gris/negro) setBackground( Color.lightGray ); setForeground( Color.black ); } return( this ); } } El cdigo es bastante simple, y la parte ms interesante es la correspondiente a la clase anidada MiRendererDeLista, reproducido antes, que implementa un controlador diferente para cada celda de la lista, extendiendo en este caso a JTextArea en lugar de JLabel, como suele ser habitual. El resultado de la ejecucin del ejemplo es el que muestra la figura.

Aunque el componente JTextArea tambin tiene sus limitaciones, como son el no permitir el uso de grficos, se puede observar que las posibilidades que se presentan al programador se han visto tremendamente incrementadas con la inclusin de este tipo de Componente y con las nuevas caractersticas que proporciona Swing.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 101

Autor: Mg. Ing. Javier Martnez Carrin

En este caso, incluso es posible hacer que la altura de la celda est recortada, en el caso de utilizar fuentes de caracteres muy grandes, debido a que la altura de cada uno de los elementos seleccionables de la lista se determina en el momento en que son construidos. TEXTOS: Swing tambin introduce nuevos componentes dentro de la manipulacin de textos. As la clase JTextArea acta como sustituto de la clase TextArea del AWT, la clase JTextField sustituye TextField del AWT y se incorporan las clases JPasswordField que viene a ser equivalente al uso de JTextField junto con el mtodo setEchoChar(), y la clase JTextPane que permite que se presente el texto con diferentes fuentes de caracteres, colores, tamaos, etc. El cambio de las caractersticas del texto que se presenta se realiza a travs de estilos. Un estilo es un conjunto de caractersticas como son FontSize, ForegroundColor, isBold, isItalic, etc. y se manipula a travs de constantes, como muestra la lnea siguiente: StyleConstants.setForeground( estilo,Color.red ) El componente JTextPane, que es el que permite estos cambios siempre tiene un estilo por defecto como modelo, DefaultStyleDocument. En la figura siguiente, la primera lnea se ha escrito nada ms arrancar el programa, es decir, con el estilo por defecto de la aplicacin, y las siguientes se intodujeron cambiando al estilo correspondiente al color del texto.

Los estilos se pueden aplicar a todo un documento o solamente a parte de l. El estilo por defecto, DefaultStyleDocument tiene un StyleContext que es el que puede manejar estilos diferentes. El ejemplo java1409.java, cuya imagen se mostraba antes, fija varios estilos y permite que se seleccione cualquiera de ellos para la introduccin del texto. import java.awt.*;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 102

Autor: Mg. Ing. Javier Martnez Carrin

import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.text.*; public class java1409 extends JPanel implements ActionListener { private Style estiloRojo,estiloVerde,estiloAzul; private JTextPane texto; public java1409() { setLayout( new BorderLayout() ); add( creaMenu(),BorderLayout.NORTH ); JTextPane texto = creaEditor(); add( texto,BorderLayout.CENTER ); } private JMenuBar creaMenu() { JMenuBar menu = new JMenuBar(); JMenu estilo = new JMenu( "Estilo" ); menu.add( estilo ); JMenuItem mi = new JMenuItem( "Rojo" ); estilo.add( mi ); mi.addActionListener( this ); mi = new JMenuItem( "Verde" ); estilo.add( mi ); mi.addActionListener( this ); mi = new JMenuItem( "Azul" ); estilo.add( mi ); mi.addActionListener( this ); return( menu ); } public void actionPerformed( ActionEvent evt ) { Style estilo = null; String color = (String)evt.getActionCommand(); if( color.equals( "Rojo" ) ) { estilo = estiloRojo;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 103

Autor: Mg. Ing. Javier Martnez Carrin

} else if( color.equals( "Azul" ) ) { estilo = estiloAzul; } else if( color.equals( "Verde" ) ) { estilo = estiloVerde; } texto.setCharacterAttributes( estilo,false ); } private JTextPane creaEditor() { StyleContext sc = creaEstilos(); DefaultStyledDocument doc = new DefaultStyledDocument( sc ); return( texto = new JTextPane( doc ) ); } private StyleContext creaEstilos() { StyleContext sc = new StyleContext(); estiloRojo = sc.addStyle( null,null ); StyleConstants.setForeground( estiloRojo,Color.red ); estiloVerde = sc.addStyle( null,null ); StyleConstants.setForeground( estiloVerde,Color.green ); StyleConstants.setFontSize( estiloVerde,24 ); estiloAzul = sc.addStyle( null,null ); StyleConstants.setForeground( estiloAzul,Color.blue ); return( sc ); } public static void main( String argv[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } ); ventana.getContentPane().add( java1409(),BorderLayout.CENTER ); ventana.setSize( 300,180 );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 104

new

Autor: Mg. Ing. Javier Martnez Carrin

ventana.setVisible( true ); } } Swing tambin incorpora receptores de eventos de conveniencia, es decir, que se pueden utilizar para que hagan las cosas solos, por ejemplo StyledEditorKit dispone de un ActionListener que realiza todo lo que debe realizar el mtodo actionPerformed(), sin necesidad de intervencin del programador. Estos receptores se pueden aadir a cualquier componente, por ejemplo, a un MenuItem, de la siguiente forma: ActionListener a = new StyledEditorKit.ForegroundAction( "set-foreground-red",Color.red ); mi.addActionListener( a ); TOOL TIPS: Casi todas las clases que se usan para crear los interfaces de usuario se derivan de JComponent. Esta clase contiene un mtodo llamado setToolTipText( String ). As que se puede indicar un texto de informacin virtualmente en cualquier lugar y lo nico que se necesita es invocar a este mtodo, indicando el texto correspondiente al mensaje. Por ejemplo, el programa anterior se incorporaron dos mensajes de informacin de este tipo, uno a cada uno de los botones del ejemplo: ... boton1.addActionListener( al ); boton1.setToolTipText( "Soy el JBoton 1" ); add( boton1 ); boton2.addActionListener( al ); boton2.setToolTipText( "Soy el JBoton 2" ); add( boton2 ); texto.setToolTipText( "Soy el JCampoDeTexto" ); add( texto ); ... y cuando el ratn permanezca sobre cada JButton, en este caso, pero JComponent en el caso ms general, durante un periodo de tiempo predeterminado, una pequea cajita conteniendo el texto aparecer al lado del puntero del ratn, tambin en este caso, indicando en botn sobre el cual se encuentra situado el cursor del ratn.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 105

Autor: Mg. Ing. Javier Martnez Carrin

ICONOS: Se puede utilizar un objeto Icon dentro de un objeto JLabel, o cualquier objeto que derive de AbstractButton; incluyendo JButton, JCheckBox, JRadioButton y los diferentes tipos de JMenuItem. El uso de iconos con etiquetas Swing es muy simple, tal como ya se mostraba en el ejemplo java1401.java y ahora en el ejemplo java1410.java, en donde se exploran todas las formas en las que se pueden emplear los iconos con los botones y sus descendientes. La figura reproduce la captura de la ejecucin de este ltimo programa, cuando el ratn llevaba varios segundos sobre la imagen correspondiente al botn, con lo cual el mensaje incorporado como ToolTip al botn que contiene el icono, aparece en pantalla.

Se puede utilizar cualquier fichero gif. Para abrir ese fichero y convertirlo en imagen, simplemente se crea un objeto ImageIcon indicndole el nombre del fichero, y ya se puede utilizar en el cdigo el objeto Icon resultante. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1410 extends JPanel { static Icon imgs[] = { new ImageIcon( "star0.gif" ), new ImageIcon( "star1.gif" ), new ImageIcon( "star2.gif" ), new ImageIcon( "star3.gif" ), new ImageIcon( "star4.gif" ), }; JButton boton = new JButton( "JButton",imgs[3] ); JButton boton2 = new JButton( "Deshabilita" ); boolean mad = false; public java1410() { boton.addActionListener( new ActionListener() {
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 106

Autor: Mg. Ing. Javier Martnez Carrin

public void actionPerformed( ActionEvent evt ){ if( mad ) { boton.setIcon( imgs[3] ); mad = false; } else { boton.setIcon( imgs[0] ); mad = true; } boton.setVerticalAlignment( JButton.TOP ); boton.setHorizontalAlignment( JButton.LEFT ); } } ); boton.setRolloverEnabled( true ); boton.setRolloverIcon( imgs[1] ); boton.setPressedIcon( imgs[2] ); boton.setDisabledIcon( imgs[4] ); boton.setToolTipText( "AleHop!" ); add( boton ); boton2.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ){ if( boton.isEnabled() ) { boton.setEnabled( false ); boton2.setText( "Habilita" ); } else { boton.setEnabled( true ); boton2.setText( "Deshabilita" ); } } } ); add( boton2 ); } public static void main( String args[] ) { java1410 boton = new java1410(); JFrame ventana = new JFrame(); ventana.getContentPane().add( boton,BorderLayout.CENTER );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 107

Autor: Mg. Ing. Javier Martnez Carrin

ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } } ); ventana.setSize( 300,200 ); ventana.setTitle( "Tutorial de Java, Swing" ); ventana.setVisible( true ); } } Un objeto Icon puede ser utilizado en muchos constructores, pero tambin se puede utilizar el mtodo setIcon() para aadir o cambiar un icono. El ejemplo muestra como un JButton, o cualquier AbstractButton, puede manejar diferentes iconos que aparecen cuando se realizan acciones sobre ese botn: se pica, se deshabilita o se pasa el cursor por encima (sin pulsar ningn botn del ratn fsico). Con esto se consigue proporcionar al botn la apariencia de encontrarse animado. MENUS: Los mens estn mucho mejor desarrollados y son ms flexibles en Swing que los que se encuentran habitualmente en otras herramientas, incluyendo paneles y applets. La sintaxis para utilizarlos es la misma que en el AWT, y se conserva el mismo problema que tambin presentan los mens en el AWT, es decir, que hay que codificar los mens directamente y no hay soporte para, por ejemplo, recursos; que, entre otras cosas, facilitara la conversin entre lenguajes de los textos de los mens. As que, hay veces en que el cdigo se hace demasiado largo y feo. En el ejemplo siguiente, java1411.java, se intenta dar un paso hacia la resolucin de este problema colocando toda la informacin de cada men en un array de elementos de tipo Object de dos dimensiones, para facilitar la introduccin de cualquier cosa en el array. Este array est organizado de tal forma que la primera fila representa el nombre del men y las siguientes filas representan los elementos u opciones del men y sus caractersticas. Las filas del array no tienen por que ser uniformes, porque el cdigo sabe perfectamente
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 108

Autor: Mg. Ing. Javier Martnez Carrin

donde

se

encuentra,

as

que

no

importa

que

las

filas

sean

completamente diferentes. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1411 extends JPanel { static final Boolean bT = new Boolean( true ); static final Boolean bF = new Boolean( false ); static ButtonGroup grupoBotones; // Clase que se utiliza para crear los distintos tipos de mens que se va a presentar en la ventana static class TipoMenu { TipoMenu( int i ) {} }; static final TipoMenu mi = new TipoMenu( 1 ); // Men con elementos normales static final TipoMenu cb = new TipoMenu( 2 ); // Men con cajas de seleccin static final TipoMenu rb = new TipoMenu( 3 ); // Men con botones de radio JTextField txt = new JTextField( 10 ); JLabel lbl = new JLabel( "Icono Seleccionado",java1410.imgs[0], JLabel.CENTER ); ActionListener al1 = new ActionListener() { public void actionPerformed( ActionEvent evt ) { txt.setText( ((JMenuItem)evt.getSource() ).getText() ); } }; ActionListener al2 = new ActionListener() { public void actionPerformed( ActionEvent evt ) { JMenuItem mi = (JMenuItem)evt.getSource(); lbl.setText( mi.getText() ); lbl.setIcon( mi.getIcon() ); } }; // En estas estrcuturas se almacenas los datos de los mens como si se tratara de los tpicos
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 109

Autor: Mg. Ing. Javier Martnez Carrin

// Recursos de X public Object menuArchivo[][] = { // Nombre del men y tecla rpida asociada { "Archivo",new Character('A') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no para cada uno de los elementos // Del men { "Nuevo",mi,new Character('N'),al1,bT }, { "Abrir",mi,new Character('b'),al1,bT }, { "Guardar",mi,new Character('G'),al1,bF }, { "Guardar como...",mi,new Character('c'),al1,bF }, { null }, // Separador { "Salir",mi,new Character('S'),al1,bT }, }; public Object menuEdicion[][] = { // Nombre del men y tecla rpida asociada { "Edicion",new Character('E') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no { "Cortar",mi,new Character('t'),al1,bT }, { "Copiar",mi,new Character('C'),al1,bT }, { "Pegar",mi,new Character('P'),al1,bT }, { null }, // Separator { "Seleccionar Todo",mi,new Character('S'),al1,bT }, }; public Object menuIconos[][] = { // Nombre del men y tecla rpida asociada { "Iconos",new Character('I') }, // Se le aade un ltimo elemento opcional que corresponde al // icono que se presenta en medio de la ventana { "Icono 0",rb,new Character('0'),al2,bT,java1410.imgs[0] }, { "Icono 1",rb,new Character('1'),al2,bT,java1410.imgs[1] }, { "Icono 2",rb,new Character('2'),al2,bT,java1410.imgs[2] }, { "Icono 3",rb,new Character('3'),al2,bT,java1410.imgs[3] }, { "Icono 4",rb,new Character('4'),al2,bT,java1410.imgs[4] }, }; public Object menuOpciones[][] = { // Nombre del men y tecla rpida asociada { "Opciones",new Character('O') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no { "Opcion 1",cb,new Character('1'),al1,bT },
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 110

Autor: Mg. Ing. Javier Martnez Carrin

{ "Opcion 2",cb,new Character('2'),al1,bT }, }; public Object menuAyuda[][] = { // Nombre del men y tecla rpida asociada { "Ayuda",new Character('y') }, // Nombre, tipo, tecla rpida, receptor asociado, habilitado o no { "Indice",mi,new Character('I'),al1,bT }, { "Contenido",mi,new Character('C'),al1,bT }, { null }, // Separator { "Acerca de...",mi,new Character('A'),al1,bT }, }; public Object barraMenu[] = { menuArchivo,menuEdicion,menuIconos,menuOpciones,menuAyuda, }; static public JMenuBar creaMenuBarra( Object barraMenuDato[] ) { JMenuBar barraMenu = new JMenuBar(); for( int i=0; i < barraMenuDato.length; i++ ) barraMenu.add( creaMenu((Object[][])barraMenuDato[i]) ); return( barraMenu ); } static public JMenu creaMenu( Object[][] menuDato ) { JMenu menu = new JMenu(); menu.setText( (String)menuDato[0][0] ); menu.setMnemonic( ((Character)menuDato[0][1]).charValue() ); grupoBotones = new ButtonGroup(); for( int i=1; i < menuDato.length; i++ ) { if( menuDato[i][0] == null ) menu.add( new JSeparator() ); else menu.add( creaMenuItem( menuDato[i] ) ); } return( menu ); } static public JMenuItem creaMenuItem( Object[] dato ) { JMenuItem m = null;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 111

Autor: Mg. Ing. Javier Martnez Carrin

TipoMenu tipo = (TipoMenu)dato[1]; if( tipo == mi ) m = new JMenuItem(); else if( tipo == cb ) m = new JCheckBoxMenuItem(); else if( tipo == rb ) { m = new JRadioButtonMenuItem(); grupoBotones.add( m ); } m.setText( (String)dato[0] ); m.setMnemonic( ((Character)dato[2]).charValue() ); m.addActionListener( (ActionListener)dato[3] ); m.setEnabled( ((Boolean)dato[4]).booleanValue() ); // Y ahora el caso opcional de los iconos if( dato.length == 6 ) m.setIcon( (Icon)dato[5] ); return( m ); } java1411() { setLayout( new BorderLayout() ); add( creaMenuBarra( barraMenu ),BorderLayout.NORTH ); JPanel p = new JPanel(); p.setLayout( new BorderLayout() ); p.add( txt,BorderLayout.NORTH ); p.add( lbl,BorderLayout.CENTER ); add( p,BorderLayout.CENTER ); } public static void main(String args[]) { java1411 panel = new java1411(); JFrame ventana = new JFrame(); ventana.getContentPane().add( panel,BorderLayout.CENTER ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) {
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 112

Autor: Mg. Ing. Javier Martnez Carrin

System.exit( 0 ); } } ); ventana.setSize( 300,200 ); ventana.setTitle( "Tutorial de Java, Swing" ); ventana.setVisible( true ); } } La intencin del ejemplo anterior es permitir al programador el uso de tablas simples que representen a cada men, en vez de que tenga que teclear lneas enteras para la construccin de esos mens. Cada tabla genera un men, figurando en la primera fila el nombre del men y el acelerador de teclado y en las siguientes los datos correspondientes a cada opcin del men, que son: la cadena de caracteres que se colocar como opcin, el tipo de opcin de que se trata, la tecla aceleradora, el receptor de eventos de tipo Action que se disparar cuando la opcin sea seleccionada y, finalmente, un indicador para saber si la opcin est habilitada o no. Si una fila empieza por un carcter nulo, se tratar como un separador. Para evitar la tediosa creacin de mltiples objetos booleanos y banderas, se han creado los valores estticos al comienzo de la clase, bT y bF, para representar los booleanos y diferentes objetos de la clase TipoMenu para describir las opciones u elementos normales del men (mi), elementos con cajas de seleccin (cb) y elementos de seleccin nica o botones de radio (rb). Hay que tener en cuenta que un array de Object puede contener solamente objetos y no valores primitivos, por lo que no se puede usar int sino Integer, etc.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 113

Autor: Mg. Ing. Javier Martnez Carrin

El ejemplo, cuya imagen en ejecucin reproduce la figura anterior, tambin muestra como JLabels y JMenuItems, y sus descendientes, pueden manejar iconos. Un objeto Icon es colocado en JLabel a travs de su constructor y cambiado cuando el correspondiente elemento del men est seleccionado. El array barraMenu est ordenado de la misma forma que se quiere que aparezcan los elementos en la barra. Se puede pasar este array al mtodo creaMenuBarra(), que ya lo divide en los arrays individuales de datos del men, pasando cada uno de estos ltimos al mtodo creaMenu(). Este mtodo, por su parte, coge la primera lnea del men y crea un objeto JMenu a partir de ella, luego invoca al mtodo creaMenuItem() para cada una de las siguientes lneas del array. Finalmente, el mtodo creaMenuItem() chequea toda la lnea y determina el tipo de men y sus atributos, creando el elemento o item que corresponda. Al final, como se puede comprobar en el constructor del ejemplo, java1411(), para crear un men desde estas tablas, es suficiente con la invocacin del constructor de la forma: creaMenuBarra( barraMenu ); y ya todo se maneja de forma recursiva. MENS POPUP: La implementacin de JPopupMenu resulta un tanto extraa: antes de nada hay que llamar al mtodo enableEvents() y seleccionar los eventos del ratn, en vez de utilizar un receptor de eventos como sera de esperar. Es decir, es posible aadir un receptor de eventos del ratn, pero el evento asociado, MouseEvent, no es capaz de devolver true desde el mtodo isPopupTrigger(); aunque tambin puede que sea porque el JDK todava est en fase beta; pero vamos, el comportamiento es ciertamente raro. A pesar de ello, el ejemplo java1412.java, s que produce el efecto deseado de presentar el men en la pantalla tal como se muestra:

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 114

Autor: Mg. Ing. Javier Martnez Carrin

Ante la llegada del evento correspondiente a la activacin del men. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1412 extends JPanel { JPopupMenu popup = new JPopupMenu(); JTextField txt = new JTextField( 10 ); public java1412() { add( txt ); ActionListener al = new ActionListener() { public void actionPerformed( ActionEvent evt ){ txt.setText( ((JMenuItem)evt.getSource()).getText() ); } }; JMenuItem elemento = new JMenuItem( "Carpanta" ); elemento.addActionListener( al ); popup.add( elemento ); elemento = new JMenuItem( "Rompetechos" ); elemento.addActionListener( al ); popup.add( elemento ); elemento = new JMenuItem( "Otilio" ); elemento.addActionListener( al ); popup.add( elemento ); popup.addSeparator(); elemento = new JMenuItem( "Mortadelo" ); elemento.addActionListener( al ); popup.add( elemento ); enableEvents( AWTEvent.MOUSE_EVENT_MASK ); } protected void processMouseEvent( MouseEvent evt ){ if( evt.isPopupTrigger() ) popup.show( evt.getComponent(),evt.getX(),evt.getY() ); else super.processMouseEvent( evt ); }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 115

Autor: Mg. Ing. Javier Martnez Carrin

public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } }); frame.getContentPane().add( java1412(),BorderLayout.CENTER ); frame.setSize( 200,150 ); frame.setVisible( true ); } } El mismo ActionListener es el que se aade a cada JMenuItem, que coge el texto de la etiqueta del men y la inserta en el JTextField. ESCALAS Y BARRAS DE PROGRESO: Una escala permite al usuario introducir datos desplazando el marcador de la escala hacia un lado o hacia otro, lo cual resulta altamente intuitivo en algunos casos; como pueden ser, por ejemplo, controles de volumen. Una barra de progreso presenta al usuario informacin en forma de una barra parcialmente llena, o parcialmente vaca, para que pueda tener una perspectiva visual de los datos. El ejemplo java1413.java, muestra los dos objetos en consonancia, de tal forma que desplazando la escala hacia un lado o hacia otro, la barra de progreso sigue el camino marcado por esos desplazamientos. La figura anterior corresponde a la ejecucin del programa, en donde se observa que la barra se ha desplazado al unsono que la escala, correspondindose en espacio. new

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 116

Autor: Mg. Ing. Javier Martnez Carrin

import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.event.*; import com.sun.java.swing.border.*; public class java1413 extends JPanel { JProgressBar barraProg = new JProgressBar(); JSlider barraSlid = new JSlider( JSlider.HORIZONTAL,0,100,60 ); public java1413() { setLayout( new GridLayout(2,1) ); add( barraProg ); barraSlid.setValue( 0 ); barraSlid.setPaintTicks( true ); barraSlid.setMajorTickSpacing( 20 ); barraSlid.setMinorTickSpacing( 5 ); barraSlid.setBorder( new TitledBorder("Desplazame") ); barraSlid.addChangeListener( new ChangeListener() { public void stateChanged( ChangeEvent evt ) { barraProg.setValue(barraSlid.getValue() ); } } ); add( barraSlid ); } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } } ); frame.getContentPane().add( java1413(),BorderLayout.CENTER ); frame.setSize( 200,150 ); frame.setVisible( true ); } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 117

new

Autor: Mg. Ing. Javier Martnez Carrin

La barra de progreso es muy simple de controlar, pero el objeto JSlider tiene una tremenda cantidad de opciones, que van desde la orientacin hasta que las marcas sean ms o menos grandes. Sin embargo, es sumamente sencillo, como se puede comprobar, incorporar un borde con ttulo. El ejemplo java1428.java, es autnomo y lo que hace es crear un thread, cuando se pulsa el botn Arrancar, que va presentando en el campo de texto un nmero de 0 a 100, y va rellenado la barra de progreso, para indicar la carga, o el tanto por ciento de completitud que se lleva. La imagen siguiente muestra el ejemplo en pleno funcionamiento.

En el cdigo solamente destacar la presencia de la clase anidada, que es la encargada de la actualizacin de la informacin, tanto de forma numrica en el campo de texto como de forma grfico en la barra de progreso. import java.lang.*; import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1428 extends JPanel { Thread hilo; Object objeto = new Object(); boolean pideParar = false; JTextField texto; JProgressBar barra; public java1428() { setLayout( new BorderLayout() );

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 118

Autor: Mg. Ing. Javier Martnez Carrin

texto = new JTextField(); add( texto,BorderLayout.NORTH ); JPanel panelInferior = new JPanel(); barra = new JProgressBar(); panelInferior.setLayout( new GridLayout(0,1) ); panelInferior.add( barra ); panelInferior.add( new JLabel( "Cargando..." ) ); JPanel panelBotones = new JPanel(); JButton botonArranque = new JButton( "Arrancar" ); botonArranque.setBackground( SystemColor.control ); panelBotones.add( botonArranque ); botonArranque.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { iniciaCuenta(); } } ); JButton botonParar = new JButton( "Parar" ); botonParar.setBackground( SystemColor.control ); panelBotones.add( botonParar ); botonParar.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { detieneCuenta(); } } ); panelInferior.add( panelBotones ); add( panelInferior,BorderLayout.SOUTH ); } public void iniciaCuenta() { if( hilo == null ) { hilo = new ThreadCarga(); pideParar = false; hilo.start(); } } public void detieneCuenta() {
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 119

Autor: Mg. Ing. Javier Martnez Carrin

synchronized( objeto ) { pideParar = true; objeto.notify(); } } class ThreadCarga extends Thread { public void run() { int min = 0; int max = 100; barra.setValue( min ); barra.setMinimum( min ); barra.setMaximum( max ); for (int i=min; i <= max; i++ ) { barra.setValue( i ); texto.setText( ""+i ); synchronized( objeto ) { if( pideParar ) break; try { objeto.wait( 100 ); } catch( InterruptedException e ) { // Se ignoran las excepciones } } } hilo = null; } } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } });
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 120

Autor: Mg. Ing. Javier Martnez Carrin

frame.getContentPane().add( java1428(),BorderLayout.CENTER ); frame.setSize( 400,150 ); frame.setVisible( true ); } } RBOLES:

new

Utilizar en Swing un rbol, como los que se despliegan en muchas de las ventanas de los sistemas operativos al uso, es tan simple como escribir: add( new JTree( new Object[]{ "este","ese","aquel" } ) ); Esto crea un arbolito muy primitivo; sin embargo, el API de Swing para rboles es inmenso, quiz sea uno de los ms grandes. En principio parece que se puede hacer cualquier cosa con rboles, pero lo cierto es que si se van a realizar tareas con un cierto grado de complejidad, es necesario un poco de investigacin y experimentacin, antes de lograr los resultados deseados. Afortunadamente, como en el trmino medio est la virtud, en Swing, JavaSoft proporciona los rboles "por defecto", que son los que generalmente necesita el programador la mayora de las veces, as que no hay demasiadas ocasiones en que haya que entrar en las profundidades de los rboles para que se deba tener un conocimiento exhaustivo del funcionamiento de estos objetos. El ejemplo java1414.java, utiliza estos rboles predefinidos, para presentar un rbol en un panel. Cuando se pulsa el botn, se aade un nuevo sub-rbol a partir del nodo que est seleccionado; si no hay ninguno, se aade en el raz. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.tree.*; // Esta clase coge un array de Strings, haciendo que el primer elemento del array sea un nodo y // el resto sean ramas de ese nodo con ello se consiguen las ramas del rbol general cuando se // pulsa el botn de test class Rama { DefaultMutableTreeNode r;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 121

Autor: Mg. Ing. Javier Martnez Carrin

public Rama( String datos[] ) { r = new DefaultMutableTreeNode( datos[0] ); for( int i=1; i < datos.length; i++ ) r.add( new DefaultMutableTreeNode( datos[i] ) ); } public DefaultMutableTreeNode node() { return( r ); } } public class java1414 extends JPanel { String datos[][] = { { "Colores","Rojo","Verde","Azul" }, { "Sabores","Salado","Dulce","Amargo" }, { "Longitud","Corta","Media","Larga" }, { "Intensidad","Alta","Media","Baja" }, { "Temperatura","Alta","Media","Baja" }, { "Volumen","Alto","Medio","Bajo" }, }; static int i=0; DefaultMutableTreeNode raiz,rama,seleccion; JTree arbol; DefaultTreeModel modelo; public java1414() { setLayout( new BorderLayout() ); raiz = new DefaultMutableTreeNode( "raiz" ); arbol = new JTree( raiz ); // Se aade el rbol y se hace sobre un ScrollPanel, para que se controle automticamente la // Longitud del rbol cuando est desplegado, de forma que aparecer una barra de // Desplazamiento para poder visualizarlo en su totalidad add( new JScrollPane( arbol ),BorderLayout.CENTER ); // Se obtiene el modelo del rbol modelo =(DefaultTreeModel)arbol.getModel(); // Y se aade el botn que va a ir incorporando ramas cada vez que se pulse JButton botonPrueba = new JButton( "Pulsame" );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 122

Autor: Mg. Ing. Javier Martnez Carrin

botonPrueba.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { if( i < datos.length ) { rama = new Rama( datos[i++] ).node(); // Control de la tlima seleccin realizada seleccion = (DefaultMutableTreeNode) arbol.getLastSelectedPathComponent(); if( seleccion == null ) seleccion = raiz; // El modelo crear el evento adecuado, y en respuesta a l, el rbol se actualizar // Automticamente modelo.insertNodeInto( rama,seleccion,0 ); } } } ); // Cambio del color del botn botonPrueba.setBackground( Color.blue ); botonPrueba.setForeground( Color.white ); // Se crea un panel para contener al botn JPanel panel = new JPanel(); panel.add( botonPrueba ); add( panel,BorderLayout.SOUTH ); } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } }); frame.getContentPane().add( java1414(),BorderLayout.CENTER ); frame.setSize( 200,500 ); frame.setVisible( true ); } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 123

new

Autor: Mg. Ing. Javier Martnez Carrin

La figura siguiente muestra la ventana de ejecucin del ejemplo, una vez pulsado el botn varias veces y con algunos de los sub-rboles desplegados.

En la aplicacin, la primera clase, Rama, coge un array de String y genera uno de los nodos el rbol, con la primera cadena como raz y el resto como sus hojas. Posteriormente, se pueden hacer llamadas al mtodo node() para generar la raz de esta rama. La clase JTree contiene un array de String de dos dimensiones, a partir del cual salen las ramas, y un contador para moverse a travs del array. Los objetos DefaultMutableTreeNode contienen los nodos, pero la representacin fsica sobre la pantalla est controlada por la clase JTree y su modelo asociado, el DefaultTreeModel. Cuando el JTree se incorpora al Frame, es incrustado automticamente en un JScrollPane, para proporcionar desplazamiento o scroll automtico al rbol. El JTree est controlado a travs de un modelo. Cuando se hace un cambio en el modelo, este modelo genera un evento que hace que el JTree realice las actualizaciones necesarias en la representacin visible del rbol. En el mtodo init(), en el caso de un applet, o en el
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 124

Autor: Mg. Ing. Javier Martnez Carrin

constructor, en el caso ms general, el modelo que se utiliza es capturado a travs del mtodo getModel(). Cuando se pulsa un botn, se crea una nueva rama. Entonces, el Componente seleccionado actual ser encontrado (o se convertir en el raz, en el caso de que no se encuentre) y el mtodo insertNodeInfo() del modelo har el trabajo de cambiar el rbol y hacer que se actualice. En la mayor parte de las ocasiones, un ejemplo como el anterior es capaz de solucionar la mayora de los problemas de implementacin que se propongan. Sin embargo, los rboles tienen el poder de hacer casi cualquier cosa que se pueda imaginar; por ejemplo, en el programa anterior se puede sustituir la palabra "default" por cualquier otra clase para proporcionar un entorno de funcionamiento diferente. Pero hay que andar con cuidado, porque muchas de estas clases tienen un interfaz muy intenso, por lo que puede llevar mucho tiempo el comprender todo el intrngulis de los rboles. Ya en la discusin de JList, se introdujeron los modelos de datos propios, es decir, una forma determinada de controlas el funcionamiento de uno de los Componentes de Swing. Pero no solamente las listas permiten hacer esto, los rboles tambin soportan estos modelos, aunque en este caso, debido a la naturaleza jerrquica de los rboles, el modelo es bastante ms complejo. En el ejemplo java1415.java se recrea un rbol que contiene las cartas de una baraja, utilizando un modelo de datos propio para la presentacin y manipulacin de cada uno de los elementos de las ramas del rbol. En el cdigo del ejemplo, se incluye la clase anidada que es la que controla cada uno de los elementos. public class MiRendererDeArbol extends JLabel implements

TreeCellRenderer { private ImageIcon imgBaraja; private ImageIcon[] imgPalos; private ImageIcon[] imgCartas; private boolean seleccionado; public MiRendererDeArbol() { // Cargamos las imgenes de las cartas imgBaraja = new ImageIcon( "_palos.gif" ); imgPalos = new ImageIcon[4]; imgPalos[0] = new ImageIcon( "_copas.gif" );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 125

Autor: Mg. Ing. Javier Martnez Carrin

imgPalos[1] = new ImageIcon( "_oros.gif" ); imgPalos[2] = new ImageIcon( "_espadas.gif" ); imgPalos[3] = new ImageIcon( "_bastos.gif" ); imgCartas = new ImageIcon[10]; imgCartas[0] = new ImageIcon( "_as.gif" ); imgCartas[1] = new ImageIcon( "_dos.gif" ); imgCartas[2] = new ImageIcon( "_tres.gif" ); imgCartas[3] = new ImageIcon( "_cuatro.gif" ); imgCartas[4] = new ImageIcon( "_cinco.gif" ); imgCartas[5] = new ImageIcon( "_seis.gif" ); imgCartas[6] = new ImageIcon( "_siete.gif" ); imgCartas[7] = new ImageIcon( "_diez.gif" ); imgCartas[8] = new ImageIcon( "_once.gif" ); imgCartas[9] = new ImageIcon( "_doce.gif" ); } public Component getTreeCellRendererComponent( JTree arbol, Object valor,boolean seleccionado,boolean expandido, boolean rama,int fila,boolean conFoco ) { // Hay que encontrar el nodo en que estamos y coger el texto que contiene DefaultMutableTreeNode nodo = (DefaultMutableTreeNode)valor; String texto = (String)nodo.getUserObject(); this.seleccionado = seleccionado; // Se fija el color de fondo en funcin de que est o no seleccionada la celda del rbol if( !seleccionado ) setForeground( Color.black ); else setForeground( Color.white ); // Fijamos el icono que corresponde al texto de la celda, para presentar la imagen de la carta // Que corresponde a esa celda if( texto.equals( "Palos" ) ) setIcon( imgBaraja ); else if( texto.equals( "Copas" ) ) setIcon( imgPalos[0] ); else if( texto.equals( "Oros" ) ) setIcon( imgPalos[1] );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 126

Autor: Mg. Ing. Javier Martnez Carrin

else if( texto.equals( "Espadas" ) ) setIcon( imgPalos[2] ); else if( texto.equals( "Bastos" ) ) setIcon( imgPalos[3] ); else if( texto.equals( "As" ) ) setIcon( imgCartas[0] ); else if( texto.equals( "Dos" ) ) setIcon( imgCartas[1] ); else if( texto.equals( "Tres" ) ) setIcon( imgCartas[2] ); else if( texto.equals( "Cuatro" ) ) setIcon( imgCartas[3] ); else if( texto.equals( "Cinco" ) ) setIcon( imgCartas[4] ); else if( texto.equals( "Seis" ) ) setIcon( imgCartas[5] ); else if( texto.equals( "Siete" ) ) setIcon( imgCartas[6] ); else if( texto.equals( "Sota" ) ) setIcon( imgCartas[7] ); else if( texto.equals( "Caballo" ) ) setIcon( imgCartas[8] ); else if( texto.equals( "Rey" ) ) setIcon( imgCartas[9] ); // A continuacin del icono, ponemos el texto setText( texto ); return( this); } // Sobreescribimos el mtodo paint() para fijar el color de fondo. Normalmente, un JLabel puede // Pintar su propio fondo, pero, seguramente debido aparentemente a un bug, o a una limitacin // En el TreeCellRenderer, es necesario recurrir al mtodo paint() para hacer esto public void paint( Graphics g ) { Color color; Icon currentI = getIcon();
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 127

Autor: Mg. Ing. Javier Martnez Carrin

// Fijamos el colos de fondo color = seleccionado ? Color.red : Color.white; g.setColor( color ); // Rellenamos el rectngulo que ocupa el texto sobre la celda del rbol g.fillRect( 0,0,getWidth()-1,getHeight()-1 ); super.paint( g ); } } La ejecucin del ejemplo, genera una imagen como la que se reproduce a continuacin, en donde se ha desplegado una de las ramas del rbol y se ha seleccionado uno de sus elementos.

La clase principal de la aplicacin crea un rbol que contiene a cada una de las cartas en uno de los palos de la baraja, y no tiene ms misterio. La clase anidada MiRendererDeArbol, es la que implementa el comportamiento que van a tener cada uno de los elementos de las ramas del rbol. Como se puede observar, esta circunstancia permite la inclusin de grficos o cualquier cambio, como el de la fuente de caracteres, en elementos especficos del rbol. Por ejemplo, puede resultar interesante en una aplicacin, el presentar los elementos de un nivel superior en negrilla para resaltar su importancia, o se puede querer aadir una imagen para ser ms explicativos. Cualquier cosa de estas, se puede implementar a travs de un modelo de datos propio. En el programa, por ejemplo, los elementos de nivel superior, correspondientes a los palos de la baraja, incluyen la carta que muestra el palo, y a cada una de las cartas individuales, tambin se les ha
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 128

Autor: Mg. Ing. Javier Martnez Carrin

aadido el grfico que las representa. Y en el cdigo, lo nico especial es la lnea en la cual se le notifica al rbol que dispone de un controlador propio e independiente para la manipulacin de las celdas o elementos del rbol. arbol.setCellRenderer( new MiRendererDeArbol() ); La clase anidada implementa un constructor para la carga de las imgenes, a fin de ahorrar tiempo a la hora de la ejecucin. El mtodo getTreeCellRendererComponent(), que debe ser proporcionado a requerimiento de la implementacin de la clase TreeCellRenderer utilizada por la clase anidada, es el responsable del dibujo de los elementos del rbol. En este caso, este mtodo determina cul es la imagen que corresponde al elemento del rbol, basndose en el texto asociado al elemento, y le asigna el icono correspondiente. Adems, fija el color de fondo de la celda que contiene al elemento, en funcin de que est seleccionado o no. Con esto ltimo hay un problema. El color de fondo de un elemento del rbol no puede fijarse dentro del mtodo de la clase que implementa el modelo, o por lo menos, si se hace as no tiene efecto alguno. Puede que sea una limitacin o un problema de Swing que piensan corregir, pero lo cierto es que esto no ocurre en otros casos, como pueden ser las listas o las tablas. Para evitar el problema, es necesario incluir el mtodo paint() dentro de la clase que implementa el controlador de las celdas. TABLAS: Al igual que los rboles, las tablas en Swing son importantes y poderosas. En principio, se crearon para constituir un interfaz ligado a bases de datos a travs del Java Database Connectivity (JDBC, para los amigos), y as evitar la complejidad inherente al manejo de los datos, proporcionando mucha flexibilidad al programador. Hay suficientes caractersticas como para montar desde una hoja de clculo bsica hasta informacin para escribir un libro completo. Sin embargo, tambin es posible crear una JTable relativamente simple si entiende correctamente el funcionamiento. La JTable controla cmo se presentan los datos, siendo el TableModel quien controla los datos en s mismos. Para crear una JTable habr pues que crear un TableModel antes, normalmente. Se puede implementar, para ello, el interfaz TableModel, pero es mucho ms simple heredar de la clase ayuda AbstractTableModel. El ejemplo java1416.java muestra esta circunstancia.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 129

Autor: Mg. Ing. Javier Martnez Carrin

import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.table.*; import com.sun.java.swing.event.*; // El Modelo de la Tabla es el que controla todos los datos que se colocan en ella class ModeloDatos extends AbstractTableModel { Object datos[][] = { {"uno","dos","tres","cuatro"}, {"cinco","seis","siete","ocho"}, {"nueve","diez","once","doce"}, }; // Esta clase imprime los datos en la consola cada vez que se produce un cambio en cualquiera // De las casillas de la tabla class TablaListener implements TableModelListener { public void tableChanged( TableModelEvent evt ) { for( int i=0; i < datos.length; i++ ) { for( int j=0; j < datos[0].length; j++ ) System.out.print( datos[i][j] + " " ); System.out.println(); } } } // Constructor ModeloDatos() { addTableModelListener( new TablaListener() ); } // Devuelve el nmero de columnas de la tabla public int getColumnCount() { return( datos[0].length ); } // Devuelve el nmero de filas de la tabla public int getRowCount() { return( datos.length ); } // Devuelve el valor de una determinada casilla de la tabla
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 130

Autor: Mg. Ing. Javier Martnez Carrin

// identificada mediante fila y columna public Object getValueAt( int fila,int col ) { return( datos[fila][col] ); } // Cambia el valor que contiene una determinada casilla de la tabla public void setValueAt( Object valor,int fila,int col ) { datos[fila][col] = valor; // Indica que se ha cambiado fireTableDataChanged(); } // Indica si la casilla identificada por fila y columna es editable public boolean isCellEditable( int fila,int col ) { return( true ); } } public class java1416 extends JPanel { public java1416() { setLayout( new BorderLayout() ); JTable tabla = new JTable( new ModeloDatos() ); // La tabla se aade a un ScrollPane para que sea ste el que controle automticamente en // Tamao de la tabla, presentando una barra de desplazamiento cuando sea necesario JScrollPane panel = new JScrollPane( tabla ); add( panel,BorderLayout.CENTER ); } public static void main(String args[]) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } } ); frame.getContentPane().add( java1416(),BorderLayout.CENTER ); frame.setSize( 200,200 ); frame.setVisible( true ); } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 131

new

Autor: Mg. Ing. Javier Martnez Carrin

En el ejemplo, para no complicar la cosa, DataModel es quien contiene el conjunto de datos, pero tambin se podran haber cogido de una base de datos. El constructor aade un receptor de eventos de tipo TableModelListener que va a imprimir el contenido de la tabla cada vez que se produzca un cambio. El resto de los mtodos utilizan la notacin de los Beans y son utilizados por el objeto JTable cuando se quiere presentar la informacin del DataModel. AbstractTableModel proporciona por defecto los mtodos setValueAt() y isCellEditable() que se utilizan para cambiar los datos, por lo que si se quiere realizar esta operacin, no queda ms remedio que sobrescribir los dos mtodos. La figura siguiente muestra la Tabla obtenida tras la ejecucin del programa en donde se ha editado la casilla correspondiente a la segunda fila y columna B.

Una vez que se tiene un TableModel, ya slo resta colocarlo en el constructor de JTable. Todos los detalles de presentacin, edicin y actualizacin estn ocultos al programador. En este ejemplo, se coloca la JTable en un JScrollPane, por lo que es necesario un mtodo especial en JTable. Las tablas pueden soportar un comportamiento ms complejo. En el ejemplo java1417.java, se utiliza un mtodo para cargar un array de ocho columnas por un ciento de filas y, posteriormente, la tabla es configurada para que muestre solamente las lneas verticales y permita la seleccin simultnea de la fila y columna en que se encuentre la celda marcada. import java.awt.*; import java.awt.event.*; import java.util.*; import com.sun.java.swing.*; import com.sun.java.swing.table.*; class java1417 extends JPanel { private JTable tabla; private JScrollPane panelScroll;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 132

Autor: Mg. Ing. Javier Martnez Carrin

private String titColumna[]; private String datoColumna[][]; public java1417() { setLayout( new BorderLayout() ); // Creamos las columnas y las cargamos con los datos que van a aparecer en la pantalla CreaColumnas(); CargaDatos(); // Creamos una instancia del componente Swing tabla = new JTable( datoColumna,titColumna ); // Aqu se configuran algunos de los parmetros que permite variar la JTable tabla.setShowHorizontalLines( false ); tabla.setRowSelectionAllowed( true ); tabla.setColumnSelectionAllowed( true ); // Cambiamos el color de la zona seleccionada (rojo/blanco) tabla.setSelectionForeground( Color.white ); tabla.setSelectionBackground( Color.red ); // Incorporamos la tabla a un panel que incorpora ya una barra de desplazamiento, para que la // Visibilidad de la tabla sea automtica panelScroll = new JScrollPane( tabla ); add( panelScroll, BorderLayout.CENTER ); } // Creamos las etiquetas que sirven de ttulo a cada una de las columnas de la tabla public void CreaColumnas() { titColumna = new String[8]; for( int i=0; i < 8; i++ ) { titColumna[i] = "Col: "+i; } } // Creamos los datos para cada uno de los elementos de la tabla public void CargaDatos() { datoColumna = new String[100][8];
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 133

Autor: Mg. Ing. Javier Martnez Carrin

for( int iY=0; iY < 100; iY++ ) { for( int iX=0; iX < 8; iX++ ) { datoColumna[iY][iX] = "" + iX + "," + iY; } } } public static void main( String args[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } ); ventana.getContentPane().add( java1417(),BorderLayout.CENTER ); ventana.setSize( 300,180 ); ventana.setVisible( true ); } } La figura siguiente muestra el resultado de la ejecucin del ejemplo. Obsrvese que cuano se selecciona un elemento individual de la tabla, aparece una seleccin en cruz de fila y columna, centrada en la celda que se ha marcado. En este ejemplo los colores de fondo y texto para la regin seleccionada se han alterado, que es otra de las facilidades que soporta el componente JTable, el cambio de color para un rea de seleccin. new

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 134

Autor: Mg. Ing. Javier Martnez Carrin

Aunque el ejemplo contiene un array relativamente grande de datos, la clase JTable no manipula grandes cantidades de informacin, resultando un rendimiento bastante pobre cuando se sobrepasan los 2000 elementos. PESTAAS: En otra seccin del Tutorial se introduce el controlador de posicionamiento de Componentes CardLayout, y se explica y muestra cmo puede manejar diferentes fichas o tarjetas. No es un mal diseo, pero Swing introduce algo mucho ms interesante y flexible, el JTabbedPane, que puede manejar directamente todas las fichas, a base de pestaas y permite cambiar a cualquiera de ellas. El contraste entre el CardLayout y el JTabbedPane es impresionante. El siguiente ejemplo java1418.java, se aprovecha de algunos de los ejemplos anteriores para poder implementar los diferentes paneles. Todos se construyen como descendientes de JPanel, as que en el programa se colocar cada uno de los ejemplos anteriores en su propio panel dentro del JTabbedPane. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.border.*; public class java1418 extends JPanel { static Object objetos[][] = { { "AWT-Clon",java1401.class }, { "Bordes",java1402.class }, { "Botones",java1404.class },
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 135

Autor: Mg. Ing. Javier Martnez Carrin

{ "Grupo de Botones",java1406.class }, { "Listas y Combo",java1407.class }, { "Barras",java1413.class }, { "Arbol",java1414.class }, { "Tabla",java1416.class }, }; static JPanel creaPanel( Class clase ) { String titulo = clase.getName(); titulo = titulo.substring( titulo.lastIndexOf('.') + 1 ); JPanel panel = null; try { panel = (JPanel)clase.newInstance(); } catch( Exception e ) { System.out.println( e ); } panel.setBorder( new TitledBorder( titulo ) ); return( panel ); } public java1418() { setLayout( new BorderLayout() ); JTabbedPane pestana = new JTabbedPane(); for( int i=0; i < objetos.length; i++ ) { pestana.addTab( (String)objetos[i][0], creaPanel( (Class)objetos[i][1] ) ); } add( pestana,BorderLayout.CENTER ); pestana.setSelectedIndex( objetos.length/2 ); } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" ); frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } } ); frame.getContentPane().add( java1418(),BorderLayout.CENTER );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 136

new

Autor: Mg. Ing. Javier Martnez Carrin

frame.setSize( 460,350 ); frame.setVisible( true ); } } Se ha utilizado un array para la configuracin: el primer elemento es el objeto String que ser colocado en la pestaa y el segundo corresponde al objeto de la clase JPanel que ser presentado dentro del correspondiente Panel. En el constructor del ejemplo se puede observar que se utilizan los dos mtodos importantes del JTabbedPane: addTab() que crea una nueva pestaa y setSelectedIndex() que indica el panel que se va a presentar en primer lugar al arrancar el programa; en este caso se selecciona uno de en medio para mostrar que no es necesario comenzar siempre por el primero. La figura siguiente reproduce esta ventana inicial, en la que aparecen las barras de desplazamiento al igual que se ilustraba uno de los ejemplos anteriores de este captulo.

En la llamada al mtodo addTab() se le proporciona la cadena que debe colocar en la pestaa y cualquier Componente del AWT. No es necesario que sea un JCompomponent, sino cualquier Componente del AWT, entre los cuales se encuentra, evidentemente, el JComponent, que deriva del Component del AWT. El Componente se presentar sobre el panel y ya no ser necesario ningn control posterior, el JTabbedPane se encarga de todo. El trozo ms interesante del cdigo del ejemplo es el correspondiente al mtodo creaPanel() que coge el objeto Class de la clase que se quiere crear y utiliza el mtodo newInstance() para crear uno, moldendolo a JPanel; desde luego, esto asume que la clase que se quiere aadir debe heredar de JPanel, sino no servira de nada. Aade un
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 137

Autor: Mg. Ing. Javier Martnez Carrin

TitledBorder que contiene el nombre de la clase y devuelve el resultado como un JPanel para que sea utilizado en addTab(). static JPanel creaPanel( Class clase ) { String titulo = clase.getName(); titulo = titulo.substring( titulo.lastIndexOf('.') + 1 ); JPanel panel = null; try { panel = (JPanel)clase.newInstance(); } catch( Exception e ) { System.out.println( e ); } panel.setBorder( new TitledBorder( titulo ) ); return( panel ); } DIALOGOS PREDEFINIDOS: Swing tambin proporciona nuevos modelos de dilogos predefinidos del sistema, como son en dilogo de seleccin de colores, el dilogo de seleccin de ficheros, dilogos de aviso, error y confirmacin, y algunos ms. La apariencia es muy distinta a la que se presentaba en el AWT en algunos casos, por ejemplo en la seleccin de ficheros. La ventana que permite la seleccin de ficheros, suele ser una ventana modal, ya que los cambios que se produzcan en ella, o la seleccin que se haga, repercutir en el funcionamiento de la aplicacin general. Normalmente, la ventana de seleccin de ficheros se utiliza para presentar una lista de ficheros y permitir al usuario seleccionar cul de ellos debe abrir la aplicacin; o, por el contrario, permitir al usuario la introduccin de un nombre o seleccin del fichero con que se quieren salvar datos. El objeto JFileChooser no realiza ninguna de estas acciones, es decir, no abre ni salva nada, sino que se limita a sleccionar el nombre del fichero con el que se desea realizar la accin; es responsabilidad del programa el llevar a cabo la apertura del fichero o la grabacin de datos. Tal como se muestra en la figura siguiente, generada tras la ejecucin del ejemplo java1419.java y realizado un montaje de las dos selecciones obtenidas tras la pulsacin de cada botn presente en la ventana, se puede observar que la mejora que se ha incorporado a Swing es sustancial, en comparacin con su opcin en AWT.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 138

Autor: Mg. Ing. Javier Martnez Carrin

Adems, resulta muy sencillo incorporar visores de los distintos tipos de ficheros, o cambiar los iconos que indican el contenido de los ficheros, etc. El ejemplo java1420.java se genera un dilogo de confirmacin, utilizando el que por defecto proporciona Swing, del mismo modo que en los ejemplos siguientes se usan algunos de los dems dilogos predefinidos. import java.awt.event.*; import com.sun.java.swing.*; public class java1420 extends JFrame implements ActionListener { public java1420() { JButton boton = new JButton( "Muestra Ventana" ); getContentPane().add( boton,"Center" ); pack(); boton.addActionListener( this ); } public void actionPerformed( ActionEvent evt ) { int res = JOptionPane.showConfirmDialog( this,"Responda Yes o No", "Tutorial de Java, Swing",JOptionPane.YES_NO_OPTION ); String respuesta = null; if( res == JOptionPane.YES_OPTION )
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 139

Autor: Mg. Ing. Javier Martnez Carrin

respuesta = "Si"; else respuesta = "No"; System.out.println( "Respuesta: "+respuesta ); } public static void main( String args[] ) { new java1420().setVisible( true ); } } Si se ejecuta el programa anterior, la imagen que aparece en la pantalla corresponde a la ventana de dilogo que va a presentar un mensaje y dos botones, uno para confirmacin, en cuyo caso devuelve el Panel como respuesta la constante YES_OPTION, y otro para la desestimacin.

As el ejemplo java1421.java utiliza el dilogo de aviso y en el ejemplo java1422.java se emplea el dilogo predefinido que permite introducir datos, y que resulta extremadamente til cuando no se desea implementar ningn interfaz de entrada, por ejemplo a la hora de pedir contraseas de acceso, en que no merece la pena el desarrollo de ventanas especficas para tal accin. Las figuras siguientes muestran ejemplos de estos dos dilogos predefinidos en Swing.

TECLADO:

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 140

Autor: Mg. Ing. Javier Martnez Carrin

Algunas de las clases de Java proporcionan mtodos de conveniencia para permitir realizar acciones a travs del teclado. Por ejemplo, la clase AbstractButton dispone del mtodo setMnemonic(), que permite especificar el carcter, que en combinacin con una de las teclas de modificacin (dependiendo del Look-and-Feel que se est utilizando), hace que se ejecuten las acciones asociadas a los botones. Esta caracterstica es muy til en los mens, tal como ya se emple en el ejemplo java1411.java. El ejemplo siguiente java1423.java, es muy sencillo, pero muestra la forma en que se utilizan estos mtodos. En la ventana aparecern nueve botones, tal como muestra la figura siguiente.

Si se pulsan las teclas correspondientes a los cursores, la X que aparece sobre los botones se desplazar en la direccin correspondiente al botn que se haya pulsado. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.border.*; public class java1423 extends JFrame implements ActionListener { protected JButton botones[] = new JButton[9]; public java1423() { super( "Tutorial de Java, Swing" ); Container pane = getContentPane(); pane.setLayout( new GridLayout( 3,3 ) ); Border borde = BorderFactory.createLineBorder( Color.black );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 141

Autor: Mg. Ing. Javier Martnez Carrin

KeyStroke arriba = KeyStroke.getKeyStroke( KeyEvent.VK_UP,0 ); KeyStroke abajo = KeyStroke.getKeyStroke( KeyEvent.VK_DOWN,0 ); KeyStroke izqda = KeyStroke.getKeyStroke( KeyEvent.VK_LEFT,0 ); KeyStroke drcha = KeyStroke.getKeyStroke( KeyEvent.VK_RIGHT,0 ); JRootPane rootPane = getRootPane(); rootPane.registerKeyboardAction( this,"arriba",arriba, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); rootPane.registerKeyboardAction( this,"abajo",abajo, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); rootPane.registerKeyboardAction( this,"drcha",drcha, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); rootPane.registerKeyboardAction( this,"izqda",izqda, JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT ); for( int i=0; i < 9; i++ ) { JButton boton; boton = new JButton(); boton.setBorder( borde ); boton.setName( new Integer(i).toString() ); pane.add( boton ); botones[i] = boton; } setSize( 200,200 ); } public void actionPerformed( ActionEvent evt ) { Component foco = getFocusOwner(); String nombre = foco.getName(); int indice = Integer.parseInt( nombre ); botones[indice].setText( "" ); String accion = evt.getActionCommand(); if( accion.equals( "arriba" ) ) { indice = (indice < 3) ? indice + 6 : indice - 3; } else if( accion.equals( "abajo" ) ) { indice = (indice > 5) ? indice - 6 : indice + 3; } else if( accion.equals( "izqda" ) ) { indice = (indice == 0) ? indice = 8 : indice - 1;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 142

Autor: Mg. Ing. Javier Martnez Carrin

} else { // asume drcha indice = (indice == 8) ? indice = 0 : indice + 1; } botones[indice].setText( "X" ); botones[indice].requestFocus(); } static public void main( String argv[] ) { new java1423().show(); } } PANELES DESPLAZABLES: En anteriores programas se ha utilizado la clase JScrollPane para proporcionar una forma automtica de desplazar el contenido de una ventana por parte del sistema. Esta clase permite dejar las manos libres al programador para centrarse en el cdigo de su aplicacin, sin tener que estar pendiente de tener que controlar la visibilidad de todo o parte del contenido de la ventana. Pero los ejemplos que se han visto no se centraban ninguno en la clase JScrollPane, por lo que son muy simples, pero visto que es una clase muy usada y til, el ejemplo java1424.java es para presentar una aplicacin un poco ms avanzada para mostrar cmo interacta en un programa. Adems, el ejemplo hace uso de la clase JSplitPane, que permite dividir la ventana en subventanas independientes. El programa implementa un JFrame que contiene un panel dividido en dos zonas, cada una conteniendo una instancia de un componente Swing. La zona superior de la ventana contiene un campo de texto y la inferior un grfico, para ilustrar el hecho de que el contenido de los paneles de desplazamiento puede ser cualquiera que se elija. El cdigo del ejemplo se muestra a continuacin y debera resultar sencillo de entender al lector, aunque hay algunos trozos sobre los que merece la pena detenerse y se comentarn a continuacin. import java.io.*; import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.event.*;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 143

Autor: Mg. Ing. Javier Martnez Carrin

class java1424 extends JPanel implements ChangeListener { private JSplitPane panelVert; private JScrollPane panelScro1; private JScrollPane panelScro2; public java1424() { setLayout( new BorderLayout() ); // Se crea una zona para presentar el texto correspondiente al fichero creaPanelSup(); // Se crea una zona inferior para mostrar el grfico creaPanelInf(); // Se crea un panel dividido verticalmente panelVert = new JSplitPane( JSplitPane.VERTICAL_SPLIT ); add( panelVert,BorderLayout.CENTER ); // Se incorporan las dos zonas que se haban creado a las dos // partes en que se ha dividido el panel principal panelVert.setLeftComponent( panelScro1 ); panelVert.setRightComponent( panelScro2 ); } public void stateChanged( ChangeEvent evt ) { // Si el evento proviene del panel principal, seguimos... if( evt.getSource() == panelScro1.getViewport() ) { // Cogemos la posicin actual dentro de la vista correspondiente al panel principal Point point = panelScro1.getViewport().getViewPosition(); // Ahora determinamos la escala correcta para las vistas, para las 2 zonas del panel principal Dimension dim1 = panelScro1.getViewport().getViewSize(); Dimension dim2 = panelScro2.getViewport().getViewSize(); float escalaX = 1; float escalaY = 1; if( dim1.width > dim2.width ) { escalaX = (float)dim1.width / (float)dim2.width; escalaY = (float)dim1.height / (float)dim2.height; // Escalamos en funcin del movimiento point.x /= escalaX; point.y /= escalaY; } else { escalaX = (float)dim2.width / (float)dim1.width;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 144

Autor: Mg. Ing. Javier Martnez Carrin

escalaY = (float)dim2.height / (float)dim1.height; // Escalamos en funcin del movimiento point.x *= escalaX; point.y *= escalaY; } // Movemos la otra vista en funcin de lo que movamos la de texto panelScro2.getViewport().setViewPosition( point ); } } private void creaPanelSup() { // Creamos el panel de la zona de texto JTextArea areaTexto = new JTextArea(); // Se carga el fichero en el rea de texto, cuidando de capturar todas las excepciones que se // Puedan producir try { FileReader fileStream = new FileReader( "java1424.java" ); areaTexto.read( fileStream, "java1424.java" ); } catch( FileNotFoundException e ) { System.out.println( "Fichero no encontrado" ); } catch( IOException e ) { System.out.println( "Error por IOException" ); } // Creamos el panel desplazable para el rea de texto panelScro1 = new JScrollPane(); panelScro1.getViewport().add( areaTexto ); panelScro1.getViewport().addChangeListener( this ); } private void creaPanelInf() { // Cargamos el grfico, o imagen , en la panatalla Icon imagenP2 = new ImageIcon( "main.gif" ); JLabel etiqP2 = new JLabel( imagenP2 ); // Creamos el panel para el grfico panelScro2 = new JScrollPane(); panelScro2.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER ); panelScro2.setHorizontalScrollBarPolicy(
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 145

Autor: Mg. Ing. Javier Martnez Carrin

ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ); panelScro2.getViewport().add( etiqP2 ); panelScro2.getViewport().addChangeListener( this ); } public static void main( String args[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ){ System.exit( 0 ); } } ); ventana.getContentPane().add( java1424(),BorderLayout.CENTER ); ventana.setSize( 460,300 ); ventana.setVisible( true ); } } Los mtodos que se usan para crear el contenido de los subpaneles es complicado. El mtodo creaPanelSup(), se limita a utilizar un componente JTextArea sobre el que carga el fichero que contiene el cdigo fuente del ejemplo. y el mtodo creaPanelInf() presenta una imagen que se desplazar en consonancia con el movimiento del panel superior. Sin embargo, s que hay un trozo de cdigo interesante en el mtodo stateChanged(), que controla los cambios producidos por accin del usuario, y es el clculo de la escala que diferencia a los dos paneles de desplazamiento. En el programa, el clculo de la escala no es demasiado preciso, debido a que no tiene en cuenta del todo el tamao de los dos paneles. Si se mueve la barra horizontal en el panel superior se puede observar esta circunstancia. Con un poco ms de matemticas por parte del lector, seguro que podr compensar el error, y a su ejercicio se deja esa correccin, simplemente indicando que hay que experimentar con los mtodos getViewPosition() y getExtentSize() de la clase JViewport para conseguir que los clculos sean correctos.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 146

new

Autor: Mg. Ing. Javier Martnez Carrin

Cuando se ejecuta el programa y se agranda la ventana, se puede ver una imagen semejante a la que reproduce la imagen siguiente.

Ahora, los movimientos sobre la barra de desplazamiento vertical en el panel superior hacen que la imagen que esta en el panel inferior se desplace al mismo tiempo. Quiza esto no le parezca al lector demasiado prctico, pero muestra cmo se puede conseguir el desplazamiento de un panel con respecto a otro; y este tipo de funcionalidad s que es de uso frecuente en muchas aplicaciones, y aqu se muestra una forma muy sencilla de poder implementarla. Otro detalle importante es la ausencia de barras de desplazamiento en el panel inferior, a pesar de que la imagen es mucho ms grande que el tamao de la subventana. Las lneas de cdigo siguientes: panelScro2.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER ); panelScro2.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER ); Son las que permiten fijar las caractersticas de las barras de desplazamiento, y en este caso se indica que no deben estar presentes. LOOK AND FEEL: Cada ejecutable Java tiene un objeto UIManager que determina el Look-and-Fee, es decir, la apariencia en pantalla y funcionamiento, que van a tener los Componentes Swing de ese ejecutable. El Look-and-Feel es la apariecia que se proporciona a los diferentes Componentes: botones, cajas de texto, cajas de seleccin, listas, etc. Java utiliza el interfaz grfico de la plataforma sobre la que se est ejecutando para presentar los Componentes del AWT con el aspecto
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 147

Autor: Mg. Ing. Javier Martnez Carrin

asociado a esa plataforma, de este modo los programas que se ejecuten en Windows tendran esa apariencia y los que se ejecuten en Unix tendrn apariencia Motif. Pero Swing permite la seleccin de esta apariencia grfica, independientemente de la plataforma en que se est ejecutando; tanto es as que, la apariencia por defecto de los Componentes Swing se denomina Metal, y es propia de Java. Teniendo siempre en cuenta las restricciones impuestas por el control de seguridad, se puede seleccionar la apariencia, o Look-and-Feel de los Componentes Swing invocando al mtodo setLookAndFeel() del objeto UIManager correspondiente al ejecutable. La forma en que se consigue esto es porque cada objeto JComponent tiene un objeto ComponentUI correspondiente que realiza todas las tareas de dibujo, manejo de eventos, control de tamao, etc. para ese JComponent. Una de las ventajas que representan las capacidades de Look&Feel incorporadas a Swing para las empresas, es el poder crear un interfaz grfico estndar y coporativo. Con el crecimiento de las intranets se estn soportando muchas aplicaciones propias que deben ejecutarse en varias plataformas, ya que lo ms normal es que en una empresa haya diferentes plataformas. Swing permite ahora que las aplicaciones porpias diseadas para uso interno de la empresa tengan una apariencia exactamente igual, independientemente de la plataforma en que se estn ejecutando. Y es que hay pequeas cosas que vuelven loco al usuario al cambiar de entorno, por ejemplo:

Ratn de dos o tres botones? Click simple o doble para activar aplicaciones? La ventana activa sigue al foco o no lo sigue? Diferentes esquemas de color Diferentes aproximaciones para proporcionar accesibilidad Difernte conjunto de iconos, o widgets Diferente nomenclatura, geografa, efectos... En la imagen se puede observar una revisin grfica de los interfaces de usuario ms utilizados actualmente.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 148

Autor: Mg. Ing. Javier Martnez Carrin

La verdad es que la frase hecha famosa por Sun, en su anuncio de Java de "Escribir una vez, ejecutar en cualquier lugar", no se ha hecho realidad hasta que han aparecido las Java Foundation Classes, incorporando a Swing. Generalmente, el cdigo Java, con AWT, se puede desarrollar y probar completamente sobre una plataforma, pero debido a las diferencias entre las mquinas virtuales de las distintas plataformas o sistemas operativos, se pueden presentar desde pequeos problemas de presentacin grfica hasta grandes incosistencias, que pueden llegar a que la aplicacin caiga durante la ejecucin o, sencillamente, que no arranque. Con Swing, estos problemas van a quedar relegados a la historia y, se contarn como ancdotas. Utilizando las libreras de Look&Feel, las aplicaciones se pueden escribir y probar utilizando un nico interfaz. Cuando esas aplicaciones sean portadas a otras plataformas, el interfaz permanecer invariable.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 149

Autor: Mg. Ing. Javier Martnez Carrin

En la imagen anterior se muestra un ejemplo de Look&Feel creado a partir de las herramientas proporcionadas por Swing. En las siguientes imgenes se muestran algunas otras alternativas.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 150

Autor: Mg. Ing. Javier Martnez Carrin

En general, para la implementacin de una apariencia nueva, hay que tener en cuenta que aunque en principio pueda parecer muy interesante, y se piense que todas las ideas son buenas para mejorar el diseo de un interfaz grfico; los usuarios que ya estn utilizando el ordenador estn acostumbrados a lo que les ofrece la plataforma con la que trabajan, y el interfaz que se disee ha de resultarles familiar; en caso contrario, la curva de aprendizaje del nuevo interfaz puede resultar tan abrupta que no se tome en cuenta el nuevo diseo. Por lo tanto, se debe utilizar con cautela el poder que pone en manos de los
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 151

Autor: Mg. Ing. Javier Martnez Carrin

programadores/diseadores la posibilidad de desarrollar un Look&Feel propio.

No obstante, y como el lector podr observar en los ejemplos de interfaces que se muestran, en el caso de crear un nuevo interfaz, hay que tener presente que la imagen es mucho ms importante que el borde, es decir, que no tiene por qu haber un borse separando todos los elementos. Adems, el gris no es el nico color neutro que se puede utilizar, y el entorno debe ser consistente con los que ya se conocen. Precisamente, la imagen siguiente reproduce ventanas creadas con algunos de los widgets ms comunes en los entornos grficos ms utilizados actualmente.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 152

Autor: Mg. Ing. Javier Martnez Carrin

Java incorpora su propio Look&Feel por defecto, cuyo nombre es Metal, y que se muestra a continuacin.

En versiones anteriores de Swing, tambin se proporcionaba el entorno Organic, en dos versiones, Santa Fe y Vancouver. La imagen siguiente reproduce un ejemplo del entorno Organic Santa Fe.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 153

Autor: Mg. Ing. Javier Martnez Carrin

Y el ejemplo que aparece a continuacin, representa la apariencia que ofreca el Look&Feel Organic Vancouver.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 154

Autor: Mg. Ing. Javier Martnez Carrin

El Look&Feel Metal, que se ha utilizado en casi todos los ejemplos de este captulo, se basa en unos principios muy sencillos, para as poder adaptarse mucho mejor a los gustos del usuario. Por ejemplo, su esquema de colores es muy simple, utilizando solamente 8 colores y pudiendo seleccionarse cualesquiera, esto hace que ya haya muchos usuarios que se han dedicado a crear Temas, o esquemas de color, para satisfacer cualquier gusto por parte del usuario que se siente delante de la pantalla. Adems de los colores, se permiten cambiar los iconos, las fuentes de caracteres y los bordes. La imagen reproduce uno de estos temas alternativos.

La apariencia de todos los elementos que aparecen en el Look&Feel Metal, son los que se muestran en las imgenes de la pgina. LOOK AND FEEL FLECHA: Y, ahora llega el momento de crear un Look&Feel propio. Para los lectores ms inquietos y que dispongan de una gran dosis de paciencia y, realmente, necesiten hacerlo, a continuacin se indica cmo se puede crear un nuevo Look&Feel para incorporarlo a Java. La mayora de los usuarios y programadores, seguro que estarn ms que satisfechos con los que proporciona Java por defecto, pero como Swing proporciona la posibilidad de controlar todo el interfaz, a los diseadores les resultar de utilidad toda esta informacin. Se va a crear un nuevo Look&Feel llamado flecha, del cual solamente se va a disear uno de los Componentes del interfaz, concretamente el Botn; los dems componentes se implementaran de forma similar, siempre teniendo en cuenta las caractersticas particulares que correspondan a cada uno de esos Componentes. El JButton que se va a crear, permitir que se indique un texto y dispondr de dos tringulos a cada lado del texto, en forma de flecha, que cambiarn de color en funcin del estado en que se encuentre el botn. La imagen siguiente reproduce la ejecucin del ejemplo java1426.java, que utiliza este nuevo Look&Feel, en el que se puede observar el nuevo
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 155

Autor: Mg. Ing. Javier Martnez Carrin

JButton que se ha creado, y los dems Componentes del interfaz, que corresponden al Look&Feel Metal, que es el que se ha utilizado como partida para la implementacin del Look&Feel Flecha.

Tambin se puede utilizar como partida cualquier otra de las apariencias que proporciona Java, o crearse el nuevo Look&Feel desde cero. La opcin ms interesante es extender uno de los ya hechos, de forma que solamente haya que crear aquellos Componentes que de verdad vayan a tener una apariencia diferente o un comportamiento distinto al del Componente del Look de Java. La imagen siguiente reproduce la ejecucin del mismo ejemplo pero utilizando el Look&Feel Motif como partida para la creacin del nuevo Look&Feel y la implementacin del JButton.

Para la implementacin de este Look&Feel se utiliza el paquete flecha, que est generado a partir y de los ficheros fuente El FlechaLookAndFeel.java, FlechaButtonListener.java FlechaButtonUI.java, FlechaButtonBorder.java.

comportamiento del botn no se altera, solamente se cambia la apariencia y la respuesta del botn a las acciones del ratn se adecan a la nueva imagen del JButton. El cdigo del ejemplo java1426.java, como se puede observar, es sumamente sencillo, y la forma de cambiar al Look&Feel creado es igualmente simple. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; public class java1426 extends JPanel {

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 156

Autor: Mg. Ing. Javier Martnez Carrin

public java1426() { // Se crea el botn que vamos a cambiar de apariencia JButton boton = new JButton( "Boton Ej." ); ActionListener miListener = new ActionListener() { public void actionPerformed( ActionEvent evt ) { String look = null; // Aqu se controla el Look&Feel presente if( evt.getActionCommand().equals( "Flecha" ) ) { look = "flecha.FlechaLookAndFeel"; } else { look = "com.sun.java.swing.plaf.metal.MetalLookAndFeel"; } try { UIManager.setLookAndFeel( look ); SwingUtilities.updateComponentTreeUI( java1426.this ); java1426.this.validate(); } catch( Exception e ) { System.err.println( "No se puede cambiar al LookAndFeel: "+look ); } } }; // Grupo de botones que va a permitir alternar entre un Look y otro ButtonGroup grupo = new ButtonGroup(); JRadioButton botonMetal = new JRadioButton( "Metal" ); botonMetal.setSelected( true ); botonMetal.addActionListener( miListener ); grupo.add( botonMetal ); JRadioButton botonFlecha = new JRadioButton( "Flecha" ); botonFlecha.addActionListener( miListener ); grupo.add( botonFlecha ); add( boton ); add( botonMetal );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 157

Autor: Mg. Ing. Javier Martnez Carrin

add( botonFlecha ); } public static void main( String args[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" ); ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } }); ventana.getContentPane().add( java1426(),BorderLayout.CENTER ); ventana.setSize( 300,100 ); ventana.show(); } } Si se repasan los ficheros que componen el paquete flecha, el lector podr observar que las clases que se implementan no revisten excesiva complicacin, ya que al extender clases ya implementadas en los paquetes cree con de el Java, solamente hay Por que modificar en aquellos la clase comportamientos que deban adecuarse a la nueva situacin que se Componente nuevo. ejemplo, FlechaLookAndFeel, lo nico necesario es mapear las cosas que se necesitan hacer con la clase nueva, para que los mtodos correspondan con los nombres correctos siguiendo la nomenclatura de las clases UI. Estos nombres se pueden ver en el paquete com.sun.java.swing.basic, o preguntando sobre un componente determinado invocando al mtodo getUIClassID(). package flecha; import java.awt.Color; import com.sun.java.swing.*; import com.sun.java.swing.plaf.*; import com.sun.java.swing.plaf.metal.*; public class FlechaLookAndFeel extends MetalLookAndFeel { public String getID() { return( "flecha" ); }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 158

new

Autor: Mg. Ing. Javier Martnez Carrin

public String getName() { return( "Flecha Look and Feel" ); } public String getDescription() { return( "Look and Feel Flecha, Tutorial de Java" ); } public boolean isNativeLookAndFeel() { return( false ); } public boolean isSupportedLookAndFeel() { return( true ); } protected void initClassDefaults( UIDefaults tabla ) { super.initClassDefaults( tabla ); table.put( "ButtonUI","flecha.FlechaButtonUI" ); } } Ahora llega el turno de crear las clases UI que se han definido. En general, las clases UI son idnticas, con excepcin del mtodo paint(); en el resto de los mtodos comunes los cambios son mnimos. En el caso concreto del botn que se est creando, son necesarias dos clases de soporte: la clase FlechaButtonBorder que va a pintar los bordes del botn y la clase FlechaButtonListener, que va a deteminar la forma de respuesta que tendr el botn ante las acciones del ratn y del teclado. package flecha; import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.border.*; import com.sun.java.swing.plaf.*; import com.sun.java.swing.plaf.basic.*; import java.io.Serializable; import com.sun.java.swing.plaf.ButtonUI;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 159

Autor: Mg. Ing. Javier Martnez Carrin

public class FlechaButtonUI extends ButtonUI implements Serializable { protected final static Insets margenDefecto = new Insets( 2,5,2,5 ); protected final static Font fuenteDefecto = new Font( "Serif",Font.BOLD,10 ); private final static Border bordeDefecto = new CompoundBorder( FlechaButtonBorder.getButtonBorder(), FlechaButtonBorder.getButtonBorder() ); protected static final int sepTxtIcono = 3; protected FlechaButtonListener receptor; protected static ButtonUI botonUI; public static ComponentUI createUI( JComponent c ) { if( botonUI == null ) { botonUI = new FlechaButtonUI(); } return( botonUI ); } public void installUI( JComponent c ) { receptor = new FlechaButtonListener( c ); c.addMouseListener( receptor ); c.addMouseMotionListener( receptor ); c.setFont( fuenteDefecto ); if( c.getBorder() == null ) c.setBorder( bordeDefecto ); } public void uninstallUI( JComponent c ) { c.removeMouseListener( receptor ); c.removeMouseMotionListener( receptor ); if( c.getBorder() == bordeDefecto ) c.setBorder( null ); } public void paint( Graphics g,JComponent c ) { AbstractButton ab = (AbstractButton)c; ButtonModel bm = ab.getModel();
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 160

Autor: Mg. Ing. Javier Martnez Carrin

Dimension tamano = ab.getSize(); g.setFont( c.getFont() ); FontMetrics fm = g.getFontMetrics(); // Desplazamiento que se aplica al texto e iconos cuando se pulsa el botn, para que simule el // Efecto de pulsado int offsetDesplaz = 0; Rectangle rectBoton = new Rectangle( tamano ); Rectangle rectIcono = new Rectangle(); Rectangle rectTexto = new Rectangle(); String texto = SwingUtilities.layoutCompoundLabel( fm, ab.getText(),ab.getIcon(), ab.getVerticalAlignment(), ab.getHorizontalAlignment(), ab.getVerticalTextPosition(), ab.getHorizontalTextPosition(), rectBoton,rectIcono,rectTexto,sepTxtIcono ); if( bm.isArmed() && bm.isPressed() ) { offsetDesplaz = 1; } // Se pinta el fondo del botn, que es en color plano, pero se le podra poner cualquier imagen if( c.isOpaque() ) { g.setColor( ab.getBackground() ); g.fillRect( 0,0,tamano.width,tamano.height ); } // Pinta las flechas if( ab.getIcon() != null ) { Icon icono = null; if ( !bm.isEnabled() ) { icono = ab.getDisabledIcon(); } else if( bm.isPressed() && bm.isArmed() ) { icono = ab.getPressedIcon();
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 161

Autor: Mg. Ing. Javier Martnez Carrin

} else if( bm.isRollover() ) { icono = ab.getRolloverIcon(); } if( icono == null ) { icono = ab.getIcon(); } if( bm.isPressed() && bm.isArmed() ) { icono.paintIcon( c,g,rectIcono.x+offsetDesplaz, rectIcono.y+offsetDesplaz ); } else { icono.paintIcon( c,g,rectIcono.x,rectIcono.y ); } } // Pinta la cadena de texto del ttulo del botn if( (texto != null) && (texto.length() != 0) ) { if( bm.isEnabled() ) { g.setColor (ab.getForeground()); BasicGraphicsUtils.drawString( g,texto,bm.getMnemonic(), rectTexto.x+offsetDesplaz, rectTexto.y+fm.getAscent()+offsetDesplaz ); } else { g.setColor( ab.getBackground().brighter() ); BasicGraphicsUtils.drawString( g,texto,bm.getMnemonic(), rectTexto.x,rectTexto.y+fm.getAscent() ); g.setColor( ab.getBackground().darker() ); BasicGraphicsUtils.drawString( g,texto,bm.getMnemonic(), rectTexto.x-1,rectTexto.y+fm.getAscent()-1 ); } } } public Dimension getMinimumSize( JComponent c ) { return( getPreferredSize( c ) ); }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 162

Autor: Mg. Ing. Javier Martnez Carrin

public Dimension getMaximumSize( JComponent c ) { return( getPreferredSize( c ) ); } public Dimension getPreferredSize( JComponent c ) { if( ( c.getComponentCount() > 0 ) || !( c instanceof AbstractButton ) ) { return( null ); } AbstractButton ab = (AbstractButton) c; Icon icono = ab.getIcon(); String texto = ab.getText(); Font font = ab.getFont(); FontMetrics fm = ab.getFontMetrics( font ); Rectangle Rectangle rectIcono = new Rectangle(); Rectangle rectTexto = new Rectangle(); SwingUtilities.layoutCompoundLabel( fm,texto,icono, ab.getVerticalAlignment(), ab.getHorizontalAlignment(), ab.getVerticalTextPosition(), ab.getHorizontalTextPosition(), rectBoton,rectIcono,rectTexto,sepTxtIcono ); // Se calcula la unin del rectngulo formado por el icono y el texto Rectangle rect = rectIcono.union( rectTexto ); Insets insets = getInsets( c ); rect.width += insets.left + insets.right; rect.height += insets.top + insets.bottom; return( rect.getSize() ); } public Insets getDefaultMargin( AbstractButton b ) { return( margenDefecto ); }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 163

rectBoton

new

Rectangle( Short.MAX_VALUE,Short.MAX_VALUE );

Autor: Mg. Ing. Javier Martnez Carrin

public Insets getInsets( JComponent c ) { Border borde = c.getBorder(); Insets insets = ((borde != null) ? borde.getBorderInsets ( c ) : new Insets( 0,0,0,0 ) ); return( insets ); } } En la clase anterior, los mtodos installUI(), uninstalUI() y createUI(), deberan ser los nicos que sorprendiesen al lector, porque los dems ya se han visto en ejemplos anteriores hasta la saciedad. Estas rutinas de instalacin tienen como cometido bsico el instalar el nuevo borde y el nuevo receptor de eventos que se han creado especficamente para el botn que se implementa. Por supuesto, el mtodo paint() pinta el objeto y el resto del trabajo se deja para la clase que controla el borde del botn. El cdigo del receptor de eventos, si no se estn haciendo cosas especficas con el teclado o a la hora de recibir el foco, debera ser muy semejante, e incluso compartido, entre mltiples objetos. Bsicamente, lo que se le dice es lo que debe hacer: la pulsacin del ratn har que el botn se arme y se hunda; que es el comportamiento normal de un JButton. Ahora bien, se puede indicar cualquier cosa; por ejemplo, si se quiere que cada vez que se pulse aparezca un mueco saludando antes de que el botn se active, pues no hay problemas en hacerlo, se puede perfectamente. En el caso del objeto FlechaButtonUI se admiten solamente los eventos de ratn habituales. package flecha; import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import java.io.Serializable; public class FlechaButtonListener implements MouseListener, MouseMotionListener,Serializable { AbstractButton ab; public FlechaButtonListener( JComponent c ) { ab = (AbstractButton)c;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 164

Autor: Mg. Ing. Javier Martnez Carrin

} public void mouseMoved( MouseEvent evt ) { } public void mouseClicked( MouseEvent evt ) { } public void mouseDragged( MouseEvent evt ) { ButtonModel bm = ab.getModel(); if( bm.isPressed() ) { Graphics g = ab.getGraphics(); if( g != null ) { Rectangle r = g.getClipBounds(); if( r.contains( evt.getPoint() ) ) bm.setArmed( true ); else bm.setArmed( false ); } } } public void mousePressed( MouseEvent evt ) { ButtonModel bm = ab.getModel(); bm.setArmed( true ); bm.setPressed( true ); } public void mouseReleased( MouseEvent evt ) { ButtonModel bm = ab.getModel(); bm.setPressed( false ); } public void mouseEntered( MouseEvent evt ) { if( ab.getRolloverIcon() != null ) ab.getModel().setRollover( true ); } public void mouseExited( MouseEvent evt ) { if( ab.getRolloverIcon() != null )
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 165

Autor: Mg. Ing. Javier Martnez Carrin

ab.getModel().setRollover( false ); } } Finalmente, la clase FlechaButtonBorder es la clase que le da la apariencia nueva al botn. El borde habitual es sustituido por dos tringulos a los lados del texto, y tambin, en funcin del estado del botn, se cambiar el color de estos tringulos. EJEMPLO SWING: Este es un ejemplo ms til que cualquiera de los que se han visto en este captulo, y aunque no llega a la complejidad de la aplicacin SwingSet, que se distibuye con Swing, tampoco tiene las caractersticas sofisticadas de multiclase (multifichero), que hacen el aprendizaje bastante penoso, por lo que se debe empezar con cosas ms simples. El ejemplo java1427.java, es un simple programa de conversin de temperaturas entre Fahrenheit y Centgrados, utilizando escalas para mostrar las cantidades. Como se puede observar en la figura siguiente, el programa presenta dos escalas verticales y una barra de men que abre varias opciones.

La escala izquierda representa la temperatura en grados Fahrenheit y la escale derecha muestra la temperatura equivalente en grados centgrados. La primera opcin de la barra del men, abre un men de opciones que permite realizar la conversin en un sentido o en otro. La segunda opcin de la barra del men hace que el Look&Feel de la aplicacin sea el que se seleccione en el grupo de botones que se depliega. Por ejemplo, la imagen siguiente muestra otro Look&Feel de la misma aplicacin.
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 166

Autor: Mg. Ing. Javier Martnez Carrin

Cuando se desplaza la posicin del marcador de la escala con el ratn, la otra escala se actualiza inmediatamente para reflejar la misma temperatura en la otra unidad de medida. El cdigo del programa es bastante simple, a pesar de resultar de cierta utilidad; lo cual representa otro ejemplo de como pequeos programas Java pueden resultar tremendamente vistosos y flexibles si se une la potencia de Java, su modelo de eventos y Swing. import java.awt.*; import java.awt.event.*; import com.sun.java.swing.*; import com.sun.java.swing.border.*; import com.sun.java.swing.event.* ; // La clase se base en un JFrame e implementa los interfaces que se indican public class java1427 extends JFrame implements ActionListener, SwingConstants, ChangeListener { // Modos de funcionamiento, o de conversin private static final int MODO_F2C = 1; private static final int MODO_C2F = 2; // Valores mximos y mnimos de las barras de desplazamiento private static final int FMIN = 0; private static final int FMAX = 140; private static final int CMIN = -20; private static final int CMAX = 60;
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 167

Autor: Mg. Ing. Javier Martnez Carrin

private static final Dimension vpad10 = new Dimension( 1,10 ); // Modo inicial int modo = MODO_F2C; static java1427 MiFrame; private Container cliente; private JSlider fahrenheit; private JSlider centigrade; private JLabel valorF; private JLabel valorC; private JMenuBar barraMenu; private JMenu menuModo; private JCheckBoxMenuItem opcionF2C; private JCheckBoxMenuItem opcionC2F; private JMenu menuLaf; private ButtonGroup grupoLaf; private JRadioButtonMenuItem opcionLaf; private UIManager.LookAndFeelInfo laf[]; // Este es el contrsuctor de la clase, que crea la barra del men superior, las barras de // Desplazamiento que van a ir mostrando las conversiones de temperatura y registra los // Receptores de eventos public java1427() { super( "Tutorial de Java, Swing" ); // Los dos paneles correspondientes a cada sistema de grados JPanel panelFH; JPanel panelCG; barraMenu = new JMenuBar(); menuModo = new JMenu( "Modo" ); menuLaf = new JMenu( "LookAndFeel" ); grupoLaf = new ButtonGroup(); // Se crean las opciones correspondientes a los modos de conversin se aaden a la barra // Superior opcionF2C = new JCheckBoxMenuItem( "Conversion Fahrenheit a Centigrados",true ); opcionC2F = new JCheckBoxMenuItem(
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 168

Autor: Mg. Ing. Javier Martnez Carrin

"Conversion Centigrados a Fahrenheit",false ); opcionF2C.addActionListener( this ); opcionC2F.addActionListener( this ); menuModo.add( opcionF2C ); menuModo.add( opcionC2F ); barraMenu.add( menuModo ); // Se crean las opciones correspondientes a los look&feels disponibles se aaden a la barra // Superior UIManager.LookAndFeelInfo laf[] = UIManager.getInstalledLookAndFeels(); for( int i=0; i < laf.length; i++ ) { opcionLaf = new JRadioButtonMenuItem( laf[i].getName() ); opcionLaf.addActionListener( this ); if( i == 0 ) opcionLaf.setSelected( true ); grupoLaf.add( opcionLaf ); menuLaf.add( opcionLaf ); } barraMenu.add( menuLaf ); // Se aade la barra de men al Frame this.setJMenuBar( barraMenu ); // Se habilitan los eventos enableEvents( AWTEvent.WINDOW_EVENT_MASK ); UIManager.installLookAndFeel( laf[0] ); // El rea cliente del frame, correspondiente a la parte que queda por debajo de la barra de // Men, se divide en dos columnas cliente = this.getContentPane(); //cliente.setLayout( new BoxLayout( cliente,BoxLayout.X_AXIS ) ); cliente.setLayout( new GridLayout( 1,2 ) ); // Se crea el panel sobre el que se va a colocar la barra correspondiente a los grados Fahrenheit, // Situando en la parte inferior una etiqueta con el valor numrico correspondiente a la conversin // o al valor convertido panelFH = new JPanel(); panelFH.setBorder( new TitledBorder( "Fahrenheit" ) ); panelFH.setLayout( new BoxLayout( panelFH, BoxLayout.Y_AXIS ) );
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 169

Autor: Mg. Ing. Javier Martnez Carrin

fahrenheit = new JSlider( VERTICAL,FMIN,FMAX,0 ); fahrenheit.setMajorTickSpacing( 20 ); fahrenheit.setMinorTickSpacing( 5 ); fahrenheit.setPaintTicks( true ); fahrenheit.setPaintLabels( true ); fahrenheit.addChangeListener( this ); panelFH.add( fahrenheit ); panelFH.add( Box.createRigidArea( vpad10 ) ); valorF = new JLabel( "00000",CENTER ); panelFH.add( valorF ); // Se crea el panel sobre el que se va a colocar la barra correspondiente a los grados // Centgrados, situando en la parte inferior una etiqueta con el valor numrico correspondiente // A la conversin o al valor convertido panelCG = new JPanel() ; panelCG.setBorder( new TitledBorder( "Centigrados" ) ); panelCG.setLayout( new BoxLayout( panelCG, BoxLayout.Y_AXIS ) ); centigrade = new JSlider( VERTICAL,CMIN,CMAX,0 ); centigrade.setMajorTickSpacing( 20 ); centigrade.setMinorTickSpacing( 5 ); centigrade.setPaintTicks( true ); centigrade.setPaintLabels( true ); centigrade.addChangeListener( this ); centigrade.setEnabled( false ); panelCG.add( centigrade ); panelCG.add( Box.createRigidArea( vpad10 ) ); valorC = new JLabel( "00000",CENTER ); panelCG.add( valorC ); // Se incorporan los paneles al frame cliente.add( panelFH ); cliente.add( panelCG ); // Se fuerzan las barras de desplazamiento a que se inicialicen a valores predefinidos //fahrenheit.setValue( FMAX ) ; }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 170

Autor: Mg. Ing. Javier Martnez Carrin

// Control del cambio de valor en las barras de desplazamiento. Se detecta el cambio en una y, // Por simpata se muestra el valor convertido en la otra public void stateChanged( ChangeEvent ce ) { JSlider js = (JSlider)ce.getSource(); int valor = js.getValue(); //System.out.println( "Cambio estado -> "+valor ); if( js.equals(fahrenheit) && modo == MODO_F2C ) { valorF.setText( Integer.toString(valor) ); actcualizaBarraCG( valor ); } else if( js.equals(centigrade) && modo == MODO_C2F ) { valorC.setText( Integer.toString(valor) ); actualizaBarraFH( valor ); } } // Actualiza la barra que muestra la temperatura en grados Fahrenheit private void actualizaBarraFH( int c ) { int f; f = (int)( (c * 9) / 5 + 32 + 0.5 ); valorF.setText( Integer.toString(f) ); fahrenheit.setValue( f ); } // Actualiza la barra que muestra la temperatura en grados Centgrados private void actcualizaBarraCG( int f ) { int c; c = (int)( (f-32) * 5 / 9 + 0.5 ); valorC.setText( Integer.toString( c ) ); centigrade.setValue( c ); } // Proceso de los eventos de alto nivel. En realidad est controlndose solamente cuando el // Usuario cierra la ventana, para concluir ejecucin la aplicacin, el resto se pasan hacia arriba
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 171

Autor: Mg. Ing. Javier Martnez Carrin

// En el rbol jerrquico public void processEvent( AWTEvent evt ) { if( evt.getID() == WindowEvent.WINDOW_CLOSING ) { System.exit( 0 ); } else { super.processEvent( evt ); } } /* Este mtodo es el que controla la accin por la cual se ha demostrado inters, que en este caso Concreto es la opcin que se selecciona entre las dos que presenta la barra de men y que Permite que la conversin de temperaturas sea en una direccin u otra y tambin el caso en que se quiera cambiar de apariencia la ventana, para tener un look-and-feel diferente al que se instala por defecto */ public void actionPerformed( ActionEvent evt ) { // Aqui controlamos el cambio de conversin if( evt.getSource() instanceof JCheckBoxMenuItem ) { JCheckBoxMenuItem jc = (JCheckBoxMenuItem)evt.getSource(); if( jc.equals( opcionF2C ) ) { opcionC2F.setState( false ); this.modo = MODO_F2C; fahrenheit.setEnabled( true ); centigrade.setEnabled( false ); } else { opcionF2C.setState( false ); this.modo = MODO_C2F; centigrade.setEnabled( true ); fahrenheit.setEnabled( false ); } } // Y aqui el cambio de apariencia de la ventana en general if( evt.getSource() instanceof JRadioButtonMenuItem ) { JRadioButtonMenuItem (JRadioButtonMenuItem)evt.getSource(); Component root = SwingUtilities.getRoot( MiFrame ); // Aqu se cambia la forma del cursor, para que aparezca el cursor de espera predefinido por la
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 172

rb

Autor: Mg. Ing. Javier Martnez Carrin

// Plataforma sobre la que se est ejecutando el programa root.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) ); try { if( rb.isSelected() && rb.getText().equals("Windows") ) { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.windows.WindowsLookAndFeel" ); SwingUtilities.updateComponentTreeUI( SwingUtilities.getRoot( MiFrame ) ); } else if( rb.isSelected() && rb.getText().equals("CDE/Motif") ) { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.motif.MotifLookAndFeel" ); SwingUtilities.updateComponentTreeUI( SwingUtilities.getRoot( MiFrame ) ); } else if( rb.isSelected() && rb.getText().equals("Metal") ) { UIManager.setLookAndFeel( "com.sun.java.swing.plaf.metal.MetalLookAndFeel" ); SwingUtilities.updateComponentTreeUI( SwingUtilities.getRoot( MiFrame ) ); } } catch( UnsupportedLookAndFeelException e ) { // Si no est soportado el Look&Feel que se acaba de seleccionar, se presenta un mensaje al // Uso, se deshabilita el botn correspondiente ala opcin del men una mejora sera poner el // Look por defecto de la plataforma. Teniendo cuidado de volver a capturar las excepciones System.err.println( "No esta soportado el LookAndFeel: "+ rb.getText() ); rb.setEnabled( false ); } catch( Exception e ) { System.err.println( "No puedo cargar el LookAndFeel: "+ rb.getText() ); } // Finalmente, se recupera el cursor por defecto del sistema root.setCursor( Cursor.getPredefinedCursor( Cursor.DEFAULT_CURS OR ) ); } }
Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 173

Autor: Mg. Ing. Javier Martnez Carrin

static public void main( String args[] ) { MiFrame = new java1427(); MiFrame.setSize( 300,300 ); MiFrame.setBackground( Color.lightGray ); MiFrame.show(); } } El cdigo no merece la pena comentarlo, ya que todos los mtodos se han visto en ejemplos anteriores, en este caso lo nico que se ha hecho ha sido reunirlos todos en una aplicacin un poco ms til que los simples ejemplos que muestran el uso de cada uno de los Componentes de Swing.

Ingeniera Informtica y de Sistemas Facultad de Ingeniera- Universidad San Pedro Chimbote Pgina N 174

Вам также может понравиться