216
Autor: Mg. Ing. Javier Martínez Carrión UNIVERSIDAD SAN PEDRO FACULTAD DE INGENIERIA ESCUELA PROFESIONAL DE INGENIERIA INFORMÁTICA Y DE SISTEMAS CURSO : FUNDAMENTOS DE PROGRAMACIÓN CICLO : II SEMESTRE: 2009-I DOCENTE : Mg. Ing. MARTINEZ CARRIÓN JAVIER Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 1

Manual de Fdp1

Embed Size (px)

Citation preview

Page 1: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

UNIVERSIDAD SAN PEDRO

FACULTAD DE INGENIERIA

ESCUELA PROFESIONAL DE INGENIERIA INFORMÁTICA Y DE SISTEMAS

CURSO : FUNDAMENTOS DE PROGRAMACIÓN

CICLO : II

SEMESTRE: 2009-I

DOCENTE : Mg. Ing. MARTINEZ CARRIÓN JAVIER

Chimbote, Abril 01 del 2009

INDICE GENERAL

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 1

Page 2: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Capítulo I:

1.- Programación Orientada a Objetos …………….. 4

1.1 Origen ……………… 4

1.2. Diferencias con la Programación Estructurada ……………… 5

1.3. La Programación Orientada a Objetos ……………… 6

2. Características de la Programación Orientada a Objetos ……………… 6

2.1 Abstracción ……………… 6

2.2 Encapsulamiento ……………… 7

2.3 Principio de Ocultamiento ……………… 7

2.4 Polimorfismo ……………… 7

2.5 Herencia ……………… 7

3. Características del Java ……………… 8

4. Netbeans ……………… 9

4.1 Historia ……………… 10

4.2 Netbeans Hoy ……………… 10

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 2

Page 3: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

1.- PROGRAMACIÓN ORIENTADA A OBJETOS:La Programación Orientada a Objetos (POO u OOP según siglas en inglés) es un paradigma de programación que define los programas en términos de "clases de objetos", objetos que son entidades que combinan estado (es decir, datos), comportamiento (esto es, procedimientos o métodos) e identidad (propiedad del objeto que lo diferencia del resto). La programación 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 módulos más fáciles de escribir, mantener y reutilizar.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 3

Page 4: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

De esta forma, un objeto contiene toda la información, (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 interacción (los llamados métodos) que favorecen la comunicación entre objetos (de una misma clase o de distintas), y en consecuencia, el cambio de estado en los propios objetos. Esta característica lleva a tratarlos como unidades indivisibles, en las que no se separan (ni deben separarse) información (datos) y procesamiento (métodos). Dada esta propiedad de conjunto de una clase de objetos, que al contar con una serie de atributos definitorios, requiere de unos métodos para poder tratarlos (lo que hace que ambos conceptos están íntimamente entrelazados), el programador debe pensar indistintamente en ambos términos, ya que no debe nunca separar o dar mayor importancia a los atributos en favor de los métodos, ni viceversa. Hacerlo puede llevar al programador a seguir el hábito erróneo de crear clases contenedoras de información por un lado y clases con métodos que manejen esa información por otro (llegando a una programación estructurada camuflada en un lenguaje de programación orientado a objetos).Esto difiere de la programación estructurada tradicional, en la que los datos y los procedimientos están separados y sin relación, ya que lo único que se busca es el procesamiento de unos datos de entrada para obtener otros de salida.La programación estructurada anima al programador a pensar sobre todo en términos de procedimientos o funciones, y en segundo lugar en las estructuras de datos que esos procedimientos manejan. En la programación estructurada se escriben funciones y después les pasan datos. Los programadores que emplean lenguajes orientados a objetos definen objetos con datos y métodos y después envían mensajes a los objetos diciendo que realicen esos métodos en sí mismos.1.1 ORIGEN

Los conceptos de la programación orientada a objetos tienen origen en Simula 67, un lenguaje diseñado para hacer simulaciones, creado por Ole-Johan Dahl y Kristen Nygaard del Centro de Cómputo Noruego en Oslo. Según se informa, la historia es que trabajaban en simulaciones de naves, y fueron confundidas por la explosión combinatoria de cómo las diversas cualidades de diversas naves podían 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 más tarde en Smalltalk, que fue desarrollado en Simula en Xerox PARC (y cuya primera versión fue escrita sobre Basic) pero diseñado para ser un sistema completamente dinámico en el cual los objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema basado en programas estáticos.La programación orientada a objetos tomó posición como el estilo de programación dominante a mediados de los años ochenta, en gran parte debido a la influencia de C++, una extensión del lenguaje de programación C. Su dominación fue consolidada gracias al auge de las Interfaces gráficas de usuario, para los cuales la programación orientada a objetos está particularmente bien adaptada. En este caso, se habla también de programación 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 aparición de Internet, y a la implementación de la máquina virtual de Java en la mayoría de navegadores. PHP en su versión 5 de a poco se ha ido masificando y soporta una orientación completa a objetos, cumpliendo todas las características propias de la orientación a objetos.

1.2 DIFERENCIAS CON LA PROGRAMACIÓN ESTRUCTURADA

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 4

Page 5: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Aunque la programación estructurada (a veces llamada procedural o procedimental) condujo a mejoras de la técnica de programación secuencial, los métodos modernos de diseño de software orientado a objetos incluyen mejoras entre las que están el uso de los patrones de diseño, diseño por contrato, y lenguajes de modelado (ej: UML).Las principales diferencias entre la programación estructurada y la orientada a objetos son:La programación orientada a objetos es más moderna, es una evolución de la programación estructurada que plasma en el diseño de una familia de lenguajes conceptos que existían previamente con algunos nuevos. La POO se basa en lenguajes que soportan sintáctica y semánticamente la unión entre los tipos abstractos de datos y sus operaciones (a esta unión se la suele llamar clase). La POO incorpora en su entorno de ejecución mecanismos tales como el polimorfismo y el envío de mensajes entre objetos. Erróneamente se le adjudica a la programación estructurada clásica ciertos problemas como si fueran inherentes a la misma. Esos problemas fueron haciéndose cada vez más graves y antes de la programación orientada a objetos diversos autores (de los que podemos destacar a Yourdon) encontraron soluciones basadas en aplicar estrictas metodologías de trabajo. De esa época son los conceptos de cohesión y acoplamiento. De esos problemas se destacan los siguientes: Modelo mental anómalo. Nuestra imagen del mundo se apoya en los seres, a los que asignamos nombres sustantivos, mientras la programación clásica se basa en el comportamiento, representado usualmente por verbos. Es difícil modificar y extender los programas, pues suele haber datos compartidos por varios subprogramas, que introducen interacciones ocultas entre ellos. Es difícil mantener los programas. Casi todos los sistemas informáticos grandes tienen errores ocultos, que no surgen a la luz hasta después de muchas horas de funcionamiento. Es difícil reutilizar los programas. Es prácticamente imposible aprovechar en una aplicación nueva las subrutinas que se diseñaron para otra. Es compleja la coordinación y organización entre programadores para la creación de aplicaciones de media y gran envergadura. En la programación orientada a objetos pura no deben utilizarse llamadas de subrutinas, únicamente mensajes.

1.3 LA PROGRAMACIÓN ORIENTADA A OBJETOS (POO) COMO SOLUCIÓN:La programación orientada a objetos es una nueva forma de programar que trata de encontrar una solución a estos problemas. Introduce nuevos conceptos, que superan y amplían 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 (métodos). 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 instanciación es la lectura de estas definiciones y la creación de un objeto a partir de ellas. Método: Algoritmo asociado a un objeto (o a una clase de objetos), cuya ejecución se desencadena tras la recepción de un "mensaje". Desde el punto de vista del comportamiento, es lo que el objeto puede hacer. Un método puede producir un cambio en las propiedades del objeto, o la generación de un "evento" con un nuevo mensaje para otro objeto del sistema.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 5

Page 6: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Evento: Un suceso en el sistema (tal como una interacción del usuario con la máquina, o un mensaje enviado por un objeto). El sistema maneja el evento enviando el mensaje adecuado al objeto pertinente. También se puede definir como evento, a la reacción que puede desencadenar un objeto, es decir la acción que genera. Mensaje: Una comunicación dirigida a un objeto, que le ordena que ejecute uno de sus métodos con ciertos parámetros asociados al evento que lo generó. 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 ejecución de algún método. Estado interno: es una propiedad invisible de los objetos, que puede ser únicamente accedida y alterada por un método 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 métodos. Representación 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 métodos con un nombre que lo identifica. Un tipo puede ser definido a través de una Clase o una Interface. En comparación con un lenguaje imperativo, una "variable", no es más que un contenedor interno del atributo del objeto o de un estado interno, así como la "función" es un procedimiento interno del método del objeto.

2.- CARACTERÍSTICAS DE LA POO:Hay un cierto desacuerdo sobre exactamente qué características de un método de programación o lenguaje le definen como "orientado a objetos", pero hay un consenso general en que las características siguientes son las más importantes (para más información, seguir los enlaces respectivos):2.1 Abstracción: 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 cómo se implementan estas características. Los procesos, las funciones o los métodos pueden también ser abstraídos y cuando lo están, una variedad de técnicas son requeridas para ampliar una abstracción.

2.2 Encapsulamiento: Significa reunir a todos los elementos que pueden considerarse pertenecientes a una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de los componentes del sistema. Algunos autores confunden este concepto con el principio de ocultación, principalmente porque se suelen emplear conjuntamente.

2.3 Principio de ocultación: Cada objeto está aislado del exterior, es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos que especifica cómo pueden interactuar con los objetos de la clase. El aislamiento protege a las propiedades de un objeto contra su modificación por quien no tenga derecho a acceder a ellas, solamente los propios métodos 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 abstracción. La aplicación entera se reduce a un agregado o rompecabezas de objetos.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 6

Page 7: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 invocación de un comportamiento en una referencia producirá el comportamiento correcto para el tipo real del objeto referenciado. Cuando esto ocurre en "tiempo de ejecución", esta última característica se llama asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios más estáticos (en "tiempo de compilación") de polimorfismo, tales como las plantillas y la sobrecarga de operadores de C++.

2.5 Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando una jerarquía de clasificación. 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 común. Cuando un objeto hereda de más de una clase se dice que hay herencia múltiple; esta característica 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# VB.NET Visual FoxPro Clarion Builder C++ Delphi Harbour Eiffel Java Lexico (en castellano) Objective-C Ocaml Oz Perl (soporta herencia múltiple) PHP (en su versión 5) PowerBuilder Python Ruby Smalltalk Magik (SmallWorld)

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 7

Page 8: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Muchos de estos lenguajes de programación no son puramente orientados a objetos, sino que son híbridos que combinan la OOP con otros paradigmas.Al igual que C++ otros lenguajes, como OOCOBOL, OOLISP, OOPROLOG y Object REXX, han sido creados añadiendo extensiones orientadas a objetos a un lenguaje de programación clásico.Un nuevo paso en la abstracción de paradigmas de programación es la Programación Orientada a Aspectos (POA). Aunque es todavía una metodología en estado de maduración, cada vez atrae a más investigadores e incluso proyectos comerciales en todo el mundo.También es necesario recalcar que en la programación 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 generación de código

ejecutable y un interprete para su ejecución. Seguro: Tiende a cero el hecho de que la aplicación deje de funcionar porque quien administra

la memoria y los recursos de la aplicación 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, también por que la Arquitectura del Lenguaje y sus librerias son totalmente organizadas y simples.

Múltiples Tecnologías: Con Java se pueden desarrollar aplicaciones Cliente Servidor con el interfaz gráfico vidsual del mismo Java, también 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 versión es el Jdk 1.4 al que Sun Microsystem lo llama como Java 2JAVA Y SUS TECNOLOGÍASExisten muchas tecnologías 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 diseñar el GUI con Java y desarrollar una aplicación

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 envíos 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.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 8

Page 9: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

JINI connection tecnology cuya filosofía 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 estándares.

4.- NETBEANSSe 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 módulos. Un módulo 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 módulo. Las aplicaciones construidas a partir de módulos pueden ser extendidas agregándole nuevos módulos. Debido a que los módulos pueden ser desarrollados independientemente, las aplicaciones basadas en la plataforma NetBeans pueden ser extendidas fácilmente por otros desarrolladores de software.NetBeans es un proyecto de código 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 código abierto NetBeans en junio 2000 y continúa 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 tutoría de la Facultad de Matemáticas y Física 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 interés, por lo que los estudiantes, después de graduarse, decidieron que lo podían convertir en un proyecto comercial. Prestando espacios web de amigos y familiares, formaron una compañía alrededor de esto. Casi todos ellos siguen trabajando en NetBeans.Tiempo después, ellos fueron contactados por Roman Stanek, un empresario que ya había 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 básica de la IDE, surgió con la idea de llamarlo NetBeans, con el fin de describir lo que ellos harían. Cuando las especificaciones de los Enterprise JavaBeans salieron, ellos decidieron trabajar con este estándar, 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 otoño de 1999, hicieron a NetBeans una alternativa realmente viable para el desarrollo de herramientas. En el verano de 1999, el equipo

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 9

Page 10: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

trabajó duro para rediseñar a DeveloperX2 en un NetBeans más modular, lo que lo convirtió en la base de NetBeans hoy en día.Algo más paso en el verano de 1999. Sun Microsystems quería una mejor herramienta de desarrollo de Java, y comenzó a estar interesado en NetBeans. En otoño de 1999, con la nueva generación de NetBeans en Beta, el acuerdo fue realizado.Sun adquirió otra compañía 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 después, se tomó la decisión de hacer a NetBeans open source. Mientras que Sun había contribuido considerablemente con líneas de código en varios proyectos de código abierto a través de los años, NetBeans se convirtió en el primer proyecto de código abierto patrocinado por ellos. En Junio del 2000 NetBeans.org fue lanzado.Fuente: Breve historia de NetBeans (en inglés)

4.2 NETBEANS HOY Un proyecto de código abierto no es nada más ni nada menos que un proceso. Toma tiempo encontrar el balance perfecto. Alrededor del primer año, (a través de NetBeans 3.2) fue crucial como inicio. Los dos años siguientes, se aprendió que sirve en términos de procesos de código abierto. En los primeros dos años, el proceso de desarrollo era tan abierto, que había más debate que implementación.Con NetBeans 3.5 se mejoró enormemente en desempeño, y con la llegada de NetBeans 3.6, se reimplementó el sistema de ventanas y la 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 había tenido NetBeans anteriormente. NetBeans IDE 5.0 introdujo un soporte mucho mejor para el desarrollo de nuevos módulos, el nuevo constructor intuitivo de interfaces Matisse, un nuevo y rediseñado 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 integración para crear aplicaciones de escritorio grandes. Empresas independientes asociadas, especializadas en desarrollo de software, proporcionan extensiones adicionales que se integran fácilmente en la plataforma y que pueden también utilizarse para desarrollar sus propias herramientas y soluciones.La plataforma ofrece servicios comunes a las aplicaciones de escritrio, permitiéndole al desarrollador enfocarse en la lógica específica de su aplicación. Entre las características de la plataforma están: Administración de las interfaces de usuario (ej. menús y barras de herramientas) Administración de las configuraciones del usuario Administración del almacenamiento (guardando y cargando cualquier tipo de dato) Administración de ventanas Framework basado en asistentes (diálogos paso a paso)

4.4 NETBEANS IDE

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 10

Page 11: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 programación. Existe además un número importante de módulos 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 código abierto escrito completamente en Java usando la plataforma NetBeans. El NetBeans IDE soporta el desarrollo de todos los tipos de aplicación Java (J2SE, web, EJB y aplicaciones móviles). Entre sus características se encuentra un sistema de proyectos basado en Ant, control de versiones y refactoring.La versión actual es NetBeans IDE 5.5, la cual fue lanzada en Octubre de 2006. NetBeans IDE 5.5 extiende las características 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, orientación 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 módulos. Cada módulo provee

una función bien definida, tales como el soporte de Java, edición, o soporte para el sistema de control de versiones. NetBeans contiene todos los módulos necesarios para el desarrollo de aplicaciones Java en una sola descarga, permitiéndole 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 creación 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 teléfonos móvilesEl Pack de Movilidad puede ser usado para escribir, probar, y depurar aplicaciones para la plataforma Java ME, tecnología existente en dispositivos móviles.

Profiler de NetBeans El Profiler de NetBeans es una herramienta para la optimización 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 Soporta proyectos de C/C++. Más información http://www.netbeans.org/kb/55/1/cnd-index.htmlEl Visual Web Pack Permite rápida y visualmente, construir aplicaciones web estándar, incluyendo Soporte para AJAX y componentes JSF.

4.5 INSTALACIÓN DE NETBEANS IDE 6.5

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 11

Page 12: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

A continuación se darán las instrucciones de como instalar NetBeans 6.5 IDE (Standalone Versión) en cada una de las plataformas soportadas. Recuerde que el JDK de java ya debe estar instalado en el sistema. INSTALACIÓN EN WINDOWS

Después de haber bajado el instalador, dar doble clic sobre el icono para iniciar el instalador. Después aparecerá el Acuerdo de Licenciamiento (License Agreement), acéptelo y de clic en Siguiente (Next). Especificar un directorio vacío 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 selección si hay más de uno. Dar clic en Siguiente (Next). Verifique que el directorio de instalación es el correcto y que se cuenta con espacio suficiente en el sistema para la instalación. De clic en Siguiente (Next) para iniciar la instalación.

INSTALACIÓN EN SISTEMAS OPERATIVOS SOLARIS (SOLARIS OS) Ejecute el instalador escribiendo lo siguiente en la línea de comando (De nuevo, netbeans_installer es el nombre del instalador de NetBeans que se bajó)): $ ./netbeans_installer Después aparecerá el Acuerdo de Licenciamiento (License Agreement), acéptelo y de clic en Siguiente (Next). Especificar un directorio vacío 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 selección si hay más de uno. Dar clic en Siguiente (Next). Verifique que el directorio de instalación es el correcto y que se cuenta con espacio suficiente en el sistema para la instalación. De clic en Siguiente (Next) para iniciar la instalación. Y luego finalizar el instalador

INSTALACIÓN EN LINUXEjecute el instalador escribiendo lo siguiente en la línea de comando (De nuevo, netbeans_installer es el nombre del instalador de NetBeans que se bajó)): $ ./netbeans_installer Después aparecerá el Acuerdo de Licenciamiento (License Agreement), acéptelo y de clic en Siguiente (Next). Especificar un directorio vacío 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 selección si hay más de uno. Dar clic en Siguiente (Next). Verifique que el directorio de instalación es el correcto y que se cuenta con espacio suficiente en el sistema para la instalación. De clic en Siguiente (Next) para iniciar la instalación.

4.6 EJECUTAR NETBEANS IDE 6.5 A continuación 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

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 12

Page 13: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Desinstalar NetBeans IDE 6.5 [editar]A continuación se mostrará como desinstalar NetBeans 6.5 IDE en los diferentes sistemas 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 VERSIÓN FECHA DE LANZAMIENTO NetBeans 6.5 Febrero 02 de 2008 NetBeans 5.5.1 Mayo 24 de 2007 NetBeans 5.5 Octubre 30 de 2006 NetBeans 5.0 Enero 2006 NetBeans 4.1 Mayo 2005 NetBeans 4.0 Diciembre 2004 NetBeans 3.6 Abril 2004 NetBeans 3.5 Junio 2003

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

Existen 2 categorías de datos principales en el lenguaje Java: Los tipos primitivos y los tipos referenciales

TIPO TAMAÑO / FORMATO DESCRIPCIÓN(Números enteros)Byte 8 – bit complemento a 2 Entero de un byteShort 16 – bit complemento a 2 Entero cortoInt 32 – bit complemento a 2 EnteroLong 64 – bit complemento a 2 Entero largo(Números reales)Float 32 – bit IEEE 754 Coma flotante de precisión simpleDouble 64 – bit IEEE 754 Coma flotante de precisión simple(otros tipos)Char 16 – bit Carácter Un solo carácterboolean True o false Un valor booleano (verdadero o falso)

5.2 TIPOS REFERENCIADOSLos 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 VARIABLESUn programa se refiere al valor de una variable por su nombre. Por convención, en Java, los nombres de las variables empiezan con una letra minúscula (los nombres de las clases empiezan con una letra mayúscula).Un nombre de variables Java: Debe ser un identificador legal de Java comprendido en una serie de caracteres

Unicote.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 13

Page 14: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Unicote es un sistema de codificación que soporta texto escrito en distintos lenguajes humanos. Unicote permite la codificación 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 código en su lenguaje nativo.

No puede ser el mismo que una palabra clave o el nombre de un valor booleano (true o false) No deben tener el mismo nombre que otras variables cuyas declaraciones aparezcan en el

mismo ámbito.TIP: Estándar para darles nombre a las variables:Los nombres de variables empiezan por una letra minúsculas una variable esta compuesta de mas de una palabra, como “nombre Apellido” las palabras se ponen juntas y cada palabra después de la primera empieza con una letra mayúscula.

5.4 OPERADORESLos 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 notación de prefijos o de sufijo.La notación de prefijo significa que el operador aparece antes de su operando: operador operando.La notación de sufijo significa que el operador aparece después de su operando:operando operadorTodos los operadores binarios de java tienen la misma notación, es decir aparecen entre los dos operandos:

op1 operador op2El lenguaje Java soporta varios operadores aritméticos, incluyendo + (suma), - (resta), * (multiplicación), / (división), y % (modulo) en todos los números enteros y de coma flotante. Por ejemplo, puede utilizar este código Java para sumar dos números:

a + bO este código para calcular el resto de una división:

c % dEsta tabla sumariza todas las operaciones aritméticas binarias Java:Operador Uso Descripción

+ 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

Nota: El lenguaje Java extiende la definición del operador + para incluir la concatenación de cadenasLos operadores + y – tienen versiones unarias que seleccionan el signo del operando:Operador Uso Descripción

+ + op Indicar un valor positivo

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 14

Page 15: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

- - op Niega el operandoAdemás, existen dos operadores de atajos aritméticos, ++ que incrementa en uno su operando, y – que decrementa en uno el valor de su operando.Operador Uso Descripción

++ op++ Incrementa op en 1; evalúa el valor antes de incrementar.++ ++ op Incrementa op en 1; evalúa el valor después de incrementar-- op-- Decrementa op en 1 ; evalúa el valor antes de decrementar en 1-- --op Decrementa op en 1; evalúa el valor después de decrementar

Operadores RelaciónalesOperadores Uso Descripción> 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 asignaciónSe utiliza el operador de asignación =, para asignar un valor a otro. Además del operador de asignación básico, Java proporciona varios operadores de asignación que permiten realizar operaciones aritméticas, lógicas o de bits y una operación de asignación al mismo tiempo. Específicamente, suponga que quiera añadir un número a una variable y asignar el resultado dentro de la misma variable, como esto:

i = i + 2Puedes ordenar esta sentencia utilizando el operador + =

i += 2;Las dos líneas de código anteriores son equivalentes.Esta tabla lista los operadores de asignación y sus equivalentes:Operador Uso Equivale a+= 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 LógicosOperador Uso Devuelve trae si && op1 && op2 Op1 y op2 son verdaderos | | op1 | | op2 Uno de los dos es verdadero ! ! op Op es falso

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 15

Page 16: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Ejemplo:Verificando si la nota esta en el intervalo cerrado [0, 20]If ( nota >0 && nota<= 20){ ……

……}

Ejemplo:1) Construir la expresión siguiente en Java:

Solución:f = Math.sqrt ((a+1)/2);

2) Si a = 20, b = 3;Cual es el valor final de v:V = a +b / 2+1Respuesta: 22

6.- SENTENCIA DE CONTROL DE FLUJO6.1 LA SENTENCIA IF

if (Condición){ / / instrucciones que es ejecutan solo cuando Condición es true}

6.2 LA SENTENCIA IF – ELSEif (respuesta == OK)

{ … / / Código para la acción respuesta = OK true …}

else{ …/ / código para la acción respuesta no igual a OK false …}

Ejemplo: rutina de anidamiento de if elseint nota;String mensaje = null;if (nota >=90)

{ mensaje = “Sobresaliente”; } else

if (nota >= 80) { mensaje = “Notable”; }

else if (nota >=70)

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 16

Page 17: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

{ 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 expresión.

int mesSwitch ( mes ) { Case 1: System.out.println (“Enero”); break;

Case 2: System.out.println (“Febrero”); break;Case 3: System.out.println (“Marzo”); break;Case 4: System.out.println (“Abril”); break;Case 5: System.out.println (“Mayo”); break;Case 6: System.out.println (“Junio”); break;Case 7: System.out.println (“Julio”); break;Case 8: System.out.println (“Agosto”); break;Case 9: System.out.println (“Setiembre”); break;Case 10: System.out.println (“Octubre”); break;Case 11: System.out.println (“Noviembre”); break;Case 12: System.out.println (“Diciembre”); break;

}

La sentencia switch evalúa su expresión; 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 basándose en la buena lectura del código o en otros factores.Otro punto de interés en la sentencia svvitch son las sentencias break después de cada case. La sentencia break hace que e! control salga de la sentencia switch y continué con la siguiente línea. La sentencia break es necesaria porque las sentencias case se siguen ejecutando hacia abajo. Esto es sin un break explícito el flujo de control seguiría secuencialmente a través 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:

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 17

Page 18: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Numerodias = 31;breakCase 4:Case 6:Case 9:Case 11:Numerodias = 30;Break;Case 2:If (((anio % 4 == 0) && !( anio % 100 == 0)) | | anio % 400 == 0))

numerodias = 29;elseNumeroDias = 28;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”); break;

case 2: System.out.println(”Febrero”); break:case 3: System.out.println(“Marzo”); break;case 4: System.out.println(“Abril”); break:case 5: Svstem.out.println(”Mayo”); break:case 6: Svstem.out.println(”Junio”); break;case 7: System.out.println(“Julio”); break:case 8: System.out.println”Agosto”); break:case 9: System.out.println(”Septiembre”); break:case 10: System.out.println( “Octubre”); break:case 11: Svstem.out.println(”Noviembre”); break:case 12: System.out.println(“Diciembre”); break;default: System.out.println(”Este, no es un mes válido!”); break;

}SENTENCIAS REPETITIVAS:6.4 SENTENCIA REPETITIVA WHILE (MIENTRAS)

While (expresión){

sentencia}

Esto es, mientras la expresión sea verdadera, ejecutara la sentencia o sentencias.Sentencia puede ser una sola instrucción o puede ser un bloque de sentencias.Ejemplo:

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 18

Page 19: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

While (System.in.read() != -1){ Contador++;

System.out.println (“se ha leído un el carácter 0 “ + contador);}Por convención el corchete abierto ‘ { ‘ se coloca al final de la misma línea donde se encuentra la sentencia while y el corchete cerrado ‘}’ empieza una nueva línea indentada a la línea en la que se encuentra el while.Además 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; condición; 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);}Imprimiría los números del cero hasta el 9 si el tamaño del arreglo fuera 10.

6.6 SENTENCIA REPETITIVA DO WHILE (REPITE HASTA QUE)do { Sentencias

} while ( Expresión Booleano);Es conveniente usar la sentencia do – while cuando el bucle debe ejecutarse al menos una vez .por ejemplo, para leer información de un fichero, sabemos que al menos debe leer un carácter:

int c;Inputstream in;…do{ c = in.read( );

...}while (c!=-1);Mientras la Expresión booleana sea verdadera seguirá repitiéndose la ejecución del bloque , y cuando la expresión booleana sea falsa terminara.

6.7 SENTENCIAS DE MANEJO DE EXCEPCIONESCuando ocurre un error dentro de un método Java, el método puede lanzar una excepción para indicar a su llamador que ha ocurrido un error y que el error está utilizando la sentencia throw.El método llamador puede utilizar las sentencias try, catch, y finally para capturar y manejar la excepción.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 19

Page 20: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

CREACIÓN DE PROYECTO EN NETBEANS

A continuación se da nociones básicas de cómo crear, compilar y ejecutar un proyecto.

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)

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 20

Page 21: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

2. Ingresar al Java Netbeans

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 21

Page 22: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

3. Haz Clic en FILE y selecciona NEW PROJECT

4. Haz Clic en Next

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 22

Page 23: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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

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

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 23

Page 24: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 24

Page 25: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

8. A continuación debemos de empezar a programar

DESARROLLO DE PROGRAMAS EJEMPLOSTEMAS: SECUENCIALES – SELECTIVAS (SIMPLE, DOBLE, MÚLTIPLE)

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 25

Page 26: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

1. /* Desarrolle un programa en Java que muestre algunos datos de usuario */

package ejercicio001; //Nombre del Proyecto

public class ejemplo001 //Nombre de la Clase{

public static void main(String []args) //Cabecera del Programa o Programa Principal{

System.out.println("Universidad San Pedro de Chimbote"); System.out.println("Curso Taller de Programación I");

System.out.println("Ingeniería Informática y de Sistemas"); System.out.println("Chimbote 14 de Abril del 2008"); } }

2. // Elaborar una aplicación 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());

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 conversión de dinero. Debes de ingresar también el tipo de cambio de moneda */

package ejercicio003; //Nombre del Proyectoimport java.io.*;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 26

Page 27: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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);

}}

4. // Calcula y Reporta la Sumatoria de todos los números comprendidos de 1 hasta n. Ingrese el valor de npackage ejercicio004;import java.io.*;

public class Ejemplo004 { public static void main(String arg[]) throws IOException { int n,sum; 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 artículo, el código de venta (c), (p) plazos y si la venta es a plazos se debe ingresar el tiempo de pago */

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 27

Page 28: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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;

else {

System.out.print("Ingrese tiempo de pago : ");t=Double.parseDouble(br.readLine());

if(t<12) pn=1.3*pa; else pn=1.6*pa; }

System.out.println("El Precio Neto del Articulo es : "+pn); }

}

LABORATORIO Nº 01TEMAS: SECUENCIALES – SELECTIVAS (SIMPLE, DOBLE, MÚLTIPLE)

TEORÍA: Desarrolle en su cuaderno de trabajo las siguientes preguntas.1. Que entiende por contador.2. Explique que es asignación.3. Que entiende por acumulador.4. Que entiende por algoritmo.5. Que entiende por programa.6. Para que se utilizan las Librerías del JAVA – NETBEANS.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 28

Page 29: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

7. El código IOException para que se utiliza.8. El código System.out,.println para que se utiliza.9. Como defino mis variables.10. Los contadores y los acumuladores son iguales11. Que entiende por Programación Estructurada (Buscar en Internet)12. Que entiende por Programación Orientada a Objetos (Buscar en Internet)

PRACTICA: Desarrolle los siguientes programas utilizando el lenguaje Java - NETBEANS 1. 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. 2. Ingrese su nombre, apellidos, sexo y sus 3 notas de un curso de Programación y luego calcule su

promedio y reporte sus datos (Apellidos y promedio).3. Ingrese inicialmente dos edades y que estos se almacenen en las variables nombres1 y nombres2

respectivamente. Ejemplo Ingreso la edad de Juan 20 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).

4. Se pide que calcule la suma de los N primeros números naturales.5. Ingresa una cantidad en moneda nacional y luego deberá reportar la salida en moneda extranjera

(Euros), usted determinará el tipo de cambio.6. Un banco local paga a su personal en dólares, y sus empleados quieren realizar compras en el centro

de la ciudad de Chimbote, para esto deberán cambiar a moneda nacional, ayude usted a realizar dicha transacción.

7. Calcula el área del Triangulo. Dados la base y la altura.8. Calcula el área del Cuadrado. Dado el lado del mismo.9. Calcula el área del Rectángulo. Dados el largo y el ancho.10. Calcula el área del Rombo.11. Calcula el perímetro del cuadrado12. Calcula la distancia recorrida por un vehículo, 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 2009DESARROLLO DE PROGRAMAS EJEMPLOSTEMAS: REPETITIVAS (DESDE, MIENTRAS, REPETIR HASTA QUE)

1. /* Se desea leer las calificaciones (Validar las calificaciones entre 0 y 20), de una clase de Informática de N alumnos (Validar N, entre 1 y 10). Contar el número total de aprobados (11 o mayor que 11) Número total de desaprobados (10 o menor que 10). */

package laboratorio04;import java.io.*;

public class CALIFICACIONES {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 29

Page 30: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

public static void main(String[] args) throws IOException { int nota,n,ca=0,cd=0; BufferedReader br= new BufferedReader(new 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 la Nota:"); nota=Integer.parseInt(br.readLine()); }while(nota<0 || nota>20); if(nota>11) ca++; else cd++; } System.out.println("Cantidad de Notas Aprobatorias es : "+ca); System.out.println("Cantidad de Notas Desaprobatorias es: "+cd); }}

2. /* Leer las N notas de una clase de Informática y deducir todas aquellas que son:

Muy Malas : Entre 0 y 5

Malas : Entre 6 y 10

Regulares : Entre 11 y 13

Buenas : Entre 14 y 17

Excelentes : Entre 18 y 20

Calcular y Reportar los siguientes resultados:

Promedio general de notas.

Reporte de cuantas notas por cada categoría se obtuvo.

Nota mayor de toda la clase. */

package laboratorio04;import java.io.*;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 30

Page 31: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

public class NOTAS {

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 br= new BufferedReader(new 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) nma=nota; if(nota<5) mma++; if(nota>5 && nota<11) mal++; if(nota>10 && nota<14) reg++; if(nota>13 && nota<18) bue++; if(nota>17 && nota<21) exc++;

} 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);

}}

3. /* Un comercio dispone de dos tipos de artículos en fichas correspondientes a diversas sucursales con los siguientes campos:Código del articulo A o BPrecio unitario del artículoNúmero de artículosRealice ventas para N clientes.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 31

Page 32: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Calcular y Reportar lo siguiente: El número de artículos existentes de cada categoría.

El costo total de los ventas de cada categoría. 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 Artículos: "); can=Integer.parseInt(br.readLine()); }while(can<1 || can>10); for(int i=0; i<can;i++) { System.out.println("Ingrese Codigo del Artículo : "); cod=(br.readLine()); do{ System.out.println("Ingrese Precio del Artículo "+(i+1)+": "); pre=Integer.parseInt(br.readLine()); }while(pre<0 || pre>10000); do{ System.out.println("Ingrese Número de Artículos a vender:"); num=Integer.parseInt(br.readLine()); }while(num<0 || num>100); if(cod.equals("a")) { caa++; coa=pre*num; sta=sta+coa; }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 32

Page 33: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

else { cab++; cob=pre*num; stb=stb+cob; } if(coa>mca) mca=coa; if(cob>mcb) mcb=coa; } if(mca>mcb) mma=mca; else mma=mcb; System.out.println("REPORTE DE RESULTADOS"); System.out.println("Total de Artículos de categoría A:"+caa); System.out.println("Total de Artículos de categoría B:"+cab); System.out.println("Costo Total de Ventas d Artículo A:"+sta); System.out.println("Costo Total de Ventas d Artículo B:"+stb); System.out.println("La Mayor Venta realizada es:"+mma); }}

LABORATORIO N° 02

TEMAS: SECUENCIALES – SELECTIVAS (SIMPLE, DOBLE, MÚLTIPLE)TEMAS: REPETITIVAS (DESDE, MIENTRAS, REPETIR HASTA QUE)

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 encuentra:Etapas de Desarrollo:

ETAPA RANGO DE EDADNiñez 00 - 10

Adolescencia 11- 18 Juventud 19 - 34

Madurez 35 - 64 Ancianidad 65 - 100

2.- En un Banco los intereses a pagar dependen del plazo al que se efectúa el préstamo. Si el préstamo es a 24 meses, se paga 14% de interés 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 cuanto dinero y el plazo al que se realiza el préstamo y determine el interés anual a pagarse, reporte todos los resultados.

3. Elaborar una aplicación para calcular la siguiente serie: (Deberá de ingresar los valores de x y n).x x2 x3 xn

S = + + + ..............+

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 33

Page 34: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

3 5 7 2n+14. Elaborar una aplicación que permita determinar y listar los números de tres cifras que sean capicúas y

números perfectos.5. Se introduce una hora determinada del día 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 varían entre 0 y 20. Luego ayuda al docente a calcular y reportar lo siguiente:

- Cantidad de aprobados. - Cantidad de desaprobados.- Promedio de solo notas aprobatorias. - Promedio de solo notas desaprobatorias.- Nota mayor del aula. - Nota menor del aula.- Porcentaje de notas aprobadas - Porcentaje de notas desaprobatorias- Promedio General del aula.

7. Desarrolle un programa que permita calcular y reportar todos los números primos de solo 2 cifras.

Chimbote, Abril del 20097. CLASES

7.1 INTRODUCCIÓNCuando se escribe un programa en un lenguaje orientado a objetos, definimos una plantilla o clase que describe las características y el comportamiento de un conjunto de objetos similares. La clase automóvil describe las características comunes de todos los automóviles: 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 más 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 automóviles concretos, por ejemplo el automóvil propio de una determinada marca, color, potencia, etc, el automóvil del vecino de otra marca, de otro color, etc., el automóvil de un amigo, etcUna 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 representación concreta y específica de una clase y que reside en la memoria del ordenador.

7.2 ATRIBUTOSSon las características 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 también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.

7.3 COMPORTAMIENTO

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 34

Page 35: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

El comportamiento de los objetos de una clase se implementa mediante funciones miembro o métodos. Un método es un conjunto de 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, también hay métodos de instancia y de clase. En el primer caso, un objeto llama a un método para realizar una determinada tarea, en el segundo, el método se llama desde la propia clase.

7.4 LA CLASEPara crear una clase se utiliza la palabra reservada class y a continuación el nombre de la clase. La definición de la clase se pone entre las llaves de apertura y cierre. El nombre de la clase empieza por letra mayúscula.class Rectangulo

{ //miembros dato//funciones miembro

}

7.5 LOS MIEMBROS DATOLos valores de los atributos se guardan en los miembros dato o variables de instancia. Los nombres de dichas variables comienzan por letra minúscula.Vamos a crear una clase denominada Rectángulo, que describa las características comunes a estas figuras planas que son las siguientes: El origen del rectángulo: el origen o posición de la esquina superior izquierda del rectángulo en el plano determinado por dos números enteros x e y. Las dimensiones del rectángulo: ancho y alto, otros dos números 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 métodos solamente se definen y se llaman. El nombre de las funciones miembro o métodos comienza por letra minúscula y deben sugerir acciones (mover, calcular, etc.). La definición de una función tiene el siguiente formato:

tipo nombreFuncion(tipo parm1, tipo parm2, tipo parm3){

//...sentencias}

Entre las llaves de apertura y cierre se coloca la definición de la función. 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 función miembro o método se escribe

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 35

Page 36: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

retorno=objeto.nombreFuncion(arg1, arg2, arg3);Cuando se llama a la función, los argumentos arg1, arg2, arg3 se copian en los parámetros parm1, parm2, parm3 y se ejecutan las sentencias dentro de la función. La función finaliza cuando se llega al final de su bloque de definición o cuando encuentra una sentencia return. Cuando se llama a la función, el valor devuelto mediante la sentencia return se asigna a la variable retorno.Cuando una función no devuelve nada se dice de tipo void. Para llamar a la función, se escribe

objeto.nombreFuncion(arg1, arg2, arg3);

Una función suele finalizar cuando llega al final del bloque de su definiciónvoid funcion(....)

{ //sentencias... }Una función puede finalizar antes del llegar al final de su definición

void funcion(....){ //sentencias...

if(condicion) return; //sentencias..

}

Una función puede devolver un valor (un tipo de dato primitivo o un objeto). double funcion(....){ double suma=0.0;

//sentencias...return suma;

}

Cualquier variable declarada dentro de la función tiene una vida temporal, existiendo en memoria, mientras la función esté activa. Se trata de variables locales a la función. Por ejemplo:

void nombreFuncion(int parm){ //...

int i=5;//...

}

La variable parm, existe desde el comienzo hasta el final de la función. La variable local i, existe desde el punto de su declaración hasta el final del bloque de la función.Se ha de tener en cuenta que las funciones miembro tienen acceso a los miembros dato, por tanto, es importante en el diseño 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 ayudarán a entender esta distinción. Hemos definido los atributos o miembros dato de la clase Rectángulo, ahora le vamos añadir un comportamiento: los objetos de la clase Rectángulo o rectángulos sabrán calcular su área, tendrán capacidad para trasladarse a otro punto del plano, sabrán si contienen en su interior un punto determinado del plano.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 36

Page 37: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

La función que calcula el área realizará la siguiente tarea, calculará el producto del ancho por el alto del rectángulo y devolverá el resultado. La función 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 rectángulo concreto.

class Rectangulo{ int x, y, ancho;

int alto; int calcularArea()

{ return (ancho*alto); }}

A la función que desplaza el rectángulo horizontalmente en dx, y verticalmente en dy, le pasamos dichos desplazamientos, y a partir de estos datos actualizará los valores que guardan sus miembros dato x e y. La función 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 función que determina si un punto está o no en el interior del rectángulo, devolverá true si el punto se encuentra en el interior del rectángulo y devolverá false si no se encuentra, es decir, será una función del tipo boolean. La función necesitará conocer las coordenadas de dicho punto. Para que un punto de coordenadas x1 e y1 esté dentro de un rectángulo 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+anchoTambién 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 lógico 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+ancho)){ return true; }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 37

Page 38: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

return false; }

}

En el lenguaje Java, si la primera condición es falsa no se evalúan 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 CONTRUCTORESUn objeto de una clase se crea llamando a una función especial denominada constructor de la clase. El constructor se llama de forma automática 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 específico 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 números que guardan los parámetros x1, y1, w y h, y con ellos inicializa los miembros dato x, y, ancho y alto.Una clase puede tener más de un constructor. Por ejemplo, el siguiente constructor crea un rectángulo 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;

}}

Este constructor crea un rectángulo de dimensiones nulas situado en el punto (0, 0),Class Rectangulo

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 38

Page 39: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

{ int x;int y;int ancho;int alto;Rectangulo(){ x=0;

y=0;ancho=0;alto=0;

}}

Con estas porciones de código definimos la clase, y la guardamos en un archivo que tenga el mismo nombre que la clase Rectángulo y con extensión .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) { x=0;

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

}

int calcularArea(){

return (ancho*alto);

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 39

Page 40: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

}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 OBJETOSPara 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 Rectángulo que denominamos ahora objeto. Dicha sentencia, crea un objeto denominado rect1 de la clase Rectángulo llamando al segundo constructor en el listado. El rectángulo 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 Rectángulo llamando al tercer constructor, dicho rectángulo estará situado en el punto de 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 rectángulo 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 MIEMBROSDesde 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 rectángulo.

rect1.ancho=100;El rectángulo rect1 que tenía 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 rectángulo rect1 llamamos a la función calcularArea para calcular el área de dicho rectángulo.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 40

Page 41: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

rect1.calcularArea();La función 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 rectángulo es "+medidaArea);

Para desplazar el rectángulo rect2, 10 unidades hacia la derecha y 20 hacia abajo, escribiremos rect2.desplazar(10, 20);

Podemos verificar mediante el siguiente código si el punto (20, 30) está en el interior del rectángulo rect1.

if(rect1.estaDentro(20,30)){ System.out.println("El punto está dentro del rectángulo"); }else{ System.out.println("El punto está fuera del rectángulo"); }

rect1.dentro() devuelve true si el punto (20, 30) que se le pasa a dicha función miembro está en el interior del rectángulo rect1, ejecutándose la primera sentencia, en caso contrario se ejecuta la segunda.

Establecemos controles de acceso a los mismos.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 rectángulo es "+medidaArea);

rect2.desplazar(10, 20); if(rect1.estaDentro(20,30)) { System.out.println("El punto está dentro del rectángulo"); }else { System.out.println("El punto está fuera del rectángulo"); }

}}

8.3 LA VIDA DE UN OBJETOEn 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 más quebraderos de cabeza le producen, olvidarse de liberar la memoria reservada. Veamos un ejemplopublic class UnaClase

{ public static void main(String[] args)

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 41

Page 42: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

{ Image granImagen=creaImagen();

mostrar(graImagen); while(condicion)

{ calcular(); }}

}El objeto granImagen, continua en memoria hasta que se alcanza el final de la función main, aunque solamente es necesario hasta el bucle while. En C o en C++ eliminariamos dicho objeto liberando la memoria 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 IDENTIFICADORESCómo se escriben los nombres de las variables, de las clases, de las funciones, etc., es un asunto muy importante de cara a la comprensión y el mantenimiento de código. En la introducción a los fundamentos del lenguaje Java hemos tratado ya de los identificadores.El código debe de ser tanto más fácil de leer y de entender como sea posible. Alguien que lea el código, incluso después de cierto tiempo, debe ser capaz de entender lo que hace a primera vista, aunque los detalles internos, es decir, cómo lo hace, precise un estudio detallado.Vemos primero un ejemplo que muestra un código poco legible y por tanto, muy difícil de mantenerpublic class Cuen

{private int ba;Cuen(int ba){ this.ba=ba; }

public void dep(int i){ ba+=i; }

public boolean ret(int i){ if(ba>=i) { ba-=i;

return true; }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 42

Page 43: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

return false;}

public int get(){ return ba; }

}Las abreviaciones empleadas solamente tienen significado para el programador en el momento de escribir el código, 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 función. El tiempo extra que se gasta en escribir con claridad el nombre de los diversos elementos que entran en el programa, se ahorra más adelante durante su desarrollo, depuración, y mejora, es decir, durante todo el ciclo de vida del programa.

9. METODOS9.1 DEFINICION

Los módulos en JAVA se llaman métodos y clases. Los programas en JAVA se escriben combinando métodos nuevos que el programador escribe con métodos “preempacados” disponibles en la Java API (También 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 métodos para definir tareas específicas que se pueden utilizar en muchos puntos de un programa. Estos se conocen como métodos definidos por el programador. Los enunciados reales que definen el método se escriben una sola vez y quedan ocultos en los demás métodos.Un método se invoca con una llamada de método. Dicha llamada específica el nombre del método y proporcionan la información (en forma de argumentos o parámetros) que el método necesita para hacer su trabajo. Los métodos permiten al programador modularizar sus programas. Todas las variables declaradas en las definiciones de métodos son variables locales: solo se conocen en el método que se definen. Casi todos los métodos tienen una lista de parámetros que permiten comunicar información entre métodos. Los parámetros de un método también son variables locales.Java API ofrece una rica colección de clases y métodos para realizar cálculos matemáticos comunes, manipular cadenas, manipular caracteres y muchas otras operaciones útiles.Ejemplo:Implemente un método que reciba como parámetro un número entero y determine si es primo o compuesto. Un número 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{

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 43

Page 44: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

int x;BufferedReader sdtin = new BufferedReader(new InputStreamReader(System.in));System.out.println( ’ \t ’ + “Determinar Números Primos" + ‘ \n ’);

System.out.println(’ “Ingrese un Número : ”);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){ System.out.println(‘ \n ’ + “El Número es Primo ”: +z’); }else{ System.out.println(‘ \n ’ + “El Número No es Primo ”:+z’); }

}

El ejemplo anterior usa el método primo, invocado desde el método main, para determinar si un número ingresado por teclado es primo o no. El método primo se invoca o llama en main con la llamada:

primo ( x);El método primo recibe una copia del valor x en el parámetro y. Luego primo va contabilizando el número de divisores que puede tener el parámetro y (mediante la variable local z), luego evalua el valor de z y emite un mensaje en función de ese valor.La definición del método primo muestra que espera un parámetro entero y. La palabra clave void que precede al nombre del método indica que éste no devuelve ningun resultado. Debe observarse que la definición completa del método esta contenida entre las llaves de la clase NumeroPrimo. En Java, todos los métodos deben definirse dentro de una definición de clase.

El formato de definción de método es:Tipo_de_valor_devuelto nombre_de_método(lista_de_parámetros){

Declaraciones y enunciados}

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 44

Page 45: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

El nombre_de_método es cualquier identificador válido. El Tipo_de_valor_devuelto es el tipo de datos del resultado que el método devuelve al invocador. La lista_de_parámetros es una lista separada por comas que contiene las declaraciones de los parámetros que el método recibe cuando se le invoca, puede darse el caso que el método no reciba parámetros(se coloca un juego de paréntesis vacío despues del nombre del método). Se debe listar explícitamente un tipo para cada parámetro de la lista de parámetros del método.Ejemplo:Implemente un método que acepte un número entero positivo y determine si es número perfecto. Un número es perfecto si la suma de sus divisores es igual al mismo número.

import java.io.*

public class NumeroPerfecto{

public static void main(String arg[ ]) trhows IOException{

int x;BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in));System.out.println( ’ \t ’ + “NUMEROS PERFECTOS" + ‘ \n ’);do{

System.out.println( “Ingrese un Número 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 Número es Perfecto” + ‘ \n ’); else System.out.println(‘ \n ’ + “El Número no es Perfecto” + ‘ \n ’); }

}

10.- MÉTODOS DE LA CLASE MATH

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 45

Page 46: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Los métodos de la clase Math permiten al programador realizar ciertos cálculos matemáticos comunes. Algunos de estos métodos se resumen en la siguiente tabla: en ella las variables x e y son de tipo double.

Método Descripción Ejemplo

abs( x ) Valor absoluto de x.

Este método también tiene versiones para valores float,

int y long.

Si x>0; abs( x ) es x

Si x=0; abs( x ) es 0

Si x<0; abs( x ) es x

ceil( x ) Redondea x al entero más pequeño no menor que x. ceil( 9.2 ) es 10

ceil( -9.8 ) es -9

cos( x ) Coseno trigonométric de x (x en radianes) cos (0.0) es 1

exp( x ) Método exponencial ex exp (1.0) es 2.71828

exp (2.0) es 7.38906

floor( x ) Redondea x al entero más grande no mayor que x floor(9.2) es 9

floor(-9.8) es -10

lg( x ) Logaritmo natural de x (base e) log(2.71828) es 1

log(7.389056 es 2

max( x, y ) Valor mayor de x e y

Este método también tiene versiones para valores float,

int y long.

max(2.3,12.7) es 12.7

max(-2.3,-12.7) es -2.3

min( x, y ) Valor menor de x e y

Este método también tiene versiones para valores float,

int y long.

min(2.3,12.7) es 2.3

min(-2.3,-12.7) es -12.7

pow( x, y ) X elevado a la potencia y (xy) pow(2,7) es 128

pow(9,0.5) es 3

Sin( x ) Seno trigonométric de x (x en radianes) sin (0.0) es 0

Sqrt( x ) Raíz cuadrada de x sqrt(900.0) es 30

sqrt(9.0) es 3

tan( x ) Tangente trigonométrica de x(x en radianes) tan(0.0) es 0

La clase Math también tiene dos constantes matemáticas de uso común: Math.PI y Math.E. La constante Math.PI(3.14159265358979323846) es la razón entre la circunferencia de un círculo y su diámetro. La constante Math.E(2.7182818284590452354) es el valor de la base de los logaritmos naturales (Que se obtienen con el método Math.log).

Una de las grandes ventajas de Java es el gran número 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.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 46

Page 47: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Paquete de Java Descripción

java.applet El paquete de Applet de Java (Java Applet Package). Contiene la clase Applet y

varias interfaces que permiten la creación de applets, la interacción de los applets

con el navegador y la reproducción de clips de audio.

java.awt El paquete de herramientas abstractas para trabajar con ventanas de Java (Java

Abstract Windowing Toolkit Package). Contiene todas las clases e interfaces

necesarias para crear y manipular interfaces gráficas con el usuario.

java.awt.image El paquete de imágenes 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 imágenes en un

programa.

java.awt.peer 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 gráfica con el usuario de Java interactuar

con sus versiones en plataformas específicas(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 botón de una forma

específica para cada plataforma.

java.io El paquete de entrada / salida de Java (Java Input / Ouput Package). Contiene

clases que permiten a los programas introducir y producir datos.

java.lang El paquete del Lenguaje Java (Java Language Package). El compilador importa

automáticamente este paquete en todos los programas. Contiene las clases e

interfaces básicas requeridas por la mayoría de programas en Java.

java.net El paquete de trabajo con Redes de Java (Java Networking Package). Contiene

clases que permiten a los programas comunicarse a través de la Internet o de

Intranets corporativas.

java.until El paquete del utilidades de Java (Java Utilities Package). Contiene clases e

interfaces de utuilidad como: manipulaciones de fechas y horas (Date), diversas

capacidades de procesamiento de números aleatorios (random), almacenamiento

y procesamiento de grandes cantidades de datos, etc.

Java API ofrece una rica colección de clases y métodos para realizar cálculos matemáticos comunes, manipular cadenas, manipular caracteres y muchas otras operaciones útiles.Generación de números aleatoriosEl método 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.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 47

Page 48: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

DESARROLLO DE PROGRAMAS EJEMPLOSTEMAS: METODOS

1. /* Implemente un método que reciba como parámetro un número entero y determine si este número es primo o compuesto. Un número 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 Números Primos" +'\n'); System.out.println("Ingrese un Número : "); x=Integer.parseInt(sdtin.readLine()); primo(x);

}

public static void primo(int y)Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 48

Page 49: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

{ int cde=0;

for(int i=1; i<=y; i++){

if(y%i ==0){

cde++; }

}if(cde==2) System.out.println('\n' + "El Número es Primo" + '\n'); else System.out.println('\n' + "El Número no es Primo" + '\n');

}}

2. /* Implemente un método que acepte un número entero positivo y determine si este número, es número perfecto o no. Un número es perfecto si la suma de sus divisores es igual al mismo número. */

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 Número 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; } }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 49

Page 50: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

if(suma ==x){ System.out.println('\n' + "El Número es Perfecto" + '\n'); }else{ System.out.println('\n' + "El Número no es Perfecto" + '\n'); }

}}

DESARROLLO DE PROGRAMAS EJEMPLOSTEMAS: CLASES Y OBJETOS

TEMAS: CREACIÓN DE OBJETOS – CONSTRUCTORES

1.- Se desea leer las calificaciones (Validar las calificaciones entre 0 y 20), de una clase de Informática de N alumnos (Validar N, entre 1 y 10) y contar el número total de aprobados (11 o mayor que 11) y de desaprobados (10 o menor que 10).

package notas01;import java.io.*;

public class NOTAS01 // Método Principal (Clase 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 Calificación: ");

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 50

Page 51: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

cal=Integer.parseInt(br.readLine());}while(cal<0 || cal>20);

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 //Método Secundario o Clase de Procesos{

double ccc=0,csd=0,cot=0,ccd=0,cdv=0;

void notasmuym(int cal){

if(cal>0 && cal<6) ccc++; }

void notasmala(int cal)

{if(cal>5 && cal<11) csd++;

}

void notasregu(int cal) {

if(cal>10 && cal<14) cot++;}

void notasbuen(int cal){

if(cal>13 && cal<18) ccd++;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 51

Page 52: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

}

void notasexce(int cal){

if(cal>17 && cal<21) cdv++;}

double repormuym(){

return ccc++;}

double repormala() {

return csd++; }

double reporregu()

{return cot++;

}

double reporbuen() {

return ccd++; }

double reporexce() {

return cdv++; }

}

2.- Leer las N notas de una clase de Informática y deducir todas aquellas que son: Muy Malas : Entre 0 y 5 Malas : Entre 6 y 10 Regulares : Entre 11 y 13 Buenas : Entre 14 y 17 Excelentes : Entre 18 y 20Calcular y Reportar los siguientes resultados:- Promedio general de notas.- Reporte de cuantas notas por cada categoría se obtuvo.- Nota mayor de toda la clase.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 52

Page 53: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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()); }

}

package calificaciones;public class PROCESOS { double cap=0;

void apro(int cal) { if(cal>10 && cal<20) cap++;

}

double reporapro() { return cap; }

}

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 53

Page 54: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

3.- Elaborar una aplicación Java que registre información básica 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;

}

void aumenta(double au){

sbas=sbas+au;}

String getapell(){

return apell;}

double getsbas(){ return sbas; }

}

public class TestEmpleado // Clase Principal{

public static void main(String []args) throws IOException{

int n;String t1,t2,temp;double su;Empleado e1;e1=new Empleado();

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 54

Page 55: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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);

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());System.out.println("Sueldo "+e1.getsbas());

}}

4. Elaborar una aplicación Java que registre información básica 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;}

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 55

Page 56: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

String getapell(){

return apell;}

double getsbas(){

return sbas;}

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);

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 56

Page 57: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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());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 aplicación Java para procesar información de un artículo. Considere atributos como Código, descripción, Stock, precio de compra y precio de venta. Elabore los métodos 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()

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 57

Page 58: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

{ 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));

System.out.println("Ingrese Codigo ");temp=br.readLine();codigo=Integer.parseInt(temp);

System.out.println("Ingrese Stock ");

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 58

Page 59: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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("Código: "+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 aplicación en Java que contenga la clase fraccion que denote atributos y funciones para operar números fraccionarios. Implementar los métodos de:IngresoListadoSuma de dos fraccionesProducto de dos fraccionesUtilice fundamento de constructores con parámetros.*/

package Fraccion;import java.io.*;import java.awt.*;import java.awt.event.*;

public class Frac { private int a,b,c,d;

public Frac() {

a=0; b=0;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 59

Page 60: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 { 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());

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 60

Page 61: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 números.

package Multiplo;import java.io.*;

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()); //Directo

p.ingreso(a,b); System.out.println("LISTADOS"); System.out.println("PRIMER NUMERO:"+p.listanumero1()); System.out.println("SEGUNDO NUMERO:"+p.listanumero2());

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 61

Page 62: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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; //Datos miembros globales int pro;

public Proceso() //Constructor {

a=0; //inicializaciones b=0; }

public Proceso(int xa, int xb) //Sobrecarga de constructor {

a=xa; b=xb; }

public void ingreso(int ya, int yb) //Asignacion de datos de ingreso { a=ya; //Metodo de ingreso 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 {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 62

Page 63: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

b=b-a; }

} return a; }

public double p_mcm() {

int mcm; mcm=pro/a; return mcm; }

}

8.- Elaborar una aplicación en Java que denote la clase Punto, que represente a un punto geométrico en el plano cartesiano. Elaborar un menú de opciones con las siguientes funciones:1. Ingreso de datos2. Listado3. Pendiente (dos puntos)4. Distancia (dos puntos)5. Colineales (tres puntos)6. 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; }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 63

Page 64: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

public void setdatos(int c, int d) { x=c; y=d; }

public int getx() { return x; }

public int gety() { return y; }

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; }

}

package Punto;import java.io.*;

public class TestPunto {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 64

Page 65: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

public static void main(String[]args) throws IOException { String temp; int a,b;

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");}

} }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 65

Page 66: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

LABORATORIO N° 03TEMAS: METODOS

TEMAS: CREACIÓN DE OBJETOS – CONSTRUCTORES

1. Implemente un método que reciba como parámetro un número entero y determine si es primo o compuesto. Un número primo es aquel que solo es divisible (Con resto cero) entre la unidad y entre si mismo.

2. Implemente un método que acepte un número entero positivo y determine si es número perfecto. Un número es perfecto si la suma de sus divisores es igual al mismo número.

3. Implemente un método que acepte como parámetro un año y determine si es bisiesto o no. Implemente el método main que invoque dicho método.

4. Hacer un programa que Implemente un método que reciba como parámetro un número y devuelva su factorial. No existe factorial de números negativos. . Para probar la función o método main pasar como argumento los 10 primeros números 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 método que acepte como parámetro la hora minuto y segundo y muestre el siguiente segundo. Implemente el método main que invoque dicho método.

7. Implemente un método que acepte como parámetro dos números enteros positivos y determine el máximo común divisor y el mínimo común múltpilo.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 66

Page 67: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Chimbote, Mayo del 2009LABORATORIO 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 Informática

de N alumnos (Validar N, entre 1 y 10) y contar el número total de aprobados (11 o mayor que 11) y

de desaprobados (10 o menor que 10).

2.- Leer las N notas de una clase de Informática y deducir todas aquellas que son:

Muy Malas : Entre 0 y 5

Malas : Entre 6 y 10

Regulares : Entre 11 y 13

Buenas : Entre 14 y 17

Excelentes : Entre 18 y 20

Calcular y Reportar los siguientes resultados:

Promedio general de notas.

Reporte de cuantas notas por cada categoría se obtuvo.

Nota mayor de toda la clase.

3.- Un comercio dispone de dos tipos de artículos en fichas correspondientes a diversas sucursales con

lo siguientes campos:

Código del articulo A o B

Precio unitario del artículo

Numero de artículos

El numero de artículos existentes de cada categoría

El costo total de los artículos de cada categoría.

4.- En un Banco los intereses a pagar dependen del plazo al que se efectúa el préstamo. Si es a 24

meses, se paga 12% de interés 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 préstamo y determine el interés anual a pagarse

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 67

Page 68: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

5.- Se tiene un Capital C que esta situado a un tipo de interés R (Los cuales deberán de ser ingresados).

Si se sabe que el Monto será igual al Capital más el interés. 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 estación climática proporciona un par de temperaturas diarias (máxima, mínima) (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 días cuyas temperaturas se han proporcionado, las medias máxima y

mínima, 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 días) de dicha persona hasta la fecha 31/08/2008

8.- Calcular y Reportar si dados 2 números leídos del teclado, uno es divisor del otro, comprobar para 5

pares de números.

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

terminación de la lectura del archivo se debe visualizar un mensaje "Existen trabajadores mayores de

65 años en un numero de....." y el numero de trabajadores mayores de 65 años.

11.- Se desea conocer una serie de datos de una empresa con 50 empleados

a) Cuantos empleados ganan más 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 máximo de 120 puntos y se han fijado los puntajes

mínimos para el ingreso a una carrera profesional, de la siguiente manera:

Carrera Profesional Puntaje Mínimo

Sistemas 100

Civil 90

Industrial 80

Agronomía 70

Arquitectura 60

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 68

Page 69: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 admisión para 2000 alumnos.

13.- Determinar la media de una lista indefinida de números positivos, terminados con un número negativo

14.- Dado el nombre de un mes y si el año es o no bisiesto, deducir el número de días del mes.

15.- Imprimir todos los números primos comprendidos entre 1 a 100 inclusive.

16.- Dados una lista de números positivos los cuales terminan cuando se ingresa un número negativo.

Deberá de calcular y Reportar lo siguiente: (Para todos los cálculos no se debe de considerar el

último número negativo ingresado).

La media general de todos los números.

Cuantos múltiplos de 7 existen.

Producto de todos los números que son de un dígito.

Sumatoria de todos los números de dos dígitos

17.- Leer 100 números. Determinar la media de los números positivos y la media de los números

negativos

18.- Ingresar un lista de N números y determinar si es múltiplo 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 raíz cuadrada y reportar en ambos casos.

19.- Dado un grupo de números 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 2 3 4 ...... 15

** ** ** ** **

1* 1 2 3 4 ...... 15

2* 2 4 6 8 ...... 30

3* 3 6 9 12 ...... 45

4* 4 8 12 16 ...... 60

..

..Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 69

Page 70: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

..

15* 15 30 45 60 ...... 225

22.- Se introduce una hora determinada del día (hh: mm: ss). Luego deberá escribir la hora

correspondiente al siguiente segundo. Es decir la salida debe de indicar en el mismo formato (hh:

mm: ss). Comprobar para N horas dadas.

23.- Los empleados de una fábrica 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

vehículos). Se tiene previsto los siguientes montos por cada vehículo que circula por la misma.

Si el vehículo cuenta con 2 ejes (Hasta 2). Debe de realizar un pago de 7.50 por cada eje.

Si el vehículo cuenta con 3 ejes hasta 4. Debe de realizar un pago de 5.00 por cada eje.

Si el vehículo cuenta con 5 ejes hasta 7. Debe de realizar un pago de 3.50 por cada eje.

Si el vehículo cuenta con más 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 vehículos por dicha garita.

25.- La siguiente tabla muestra el costo por día de alojamiento en un hotel, según el tipo de cuarto que se

elija:

Tipo 1 2 3 4 5

Costo por día S/. 50 75 100 80 150

Además si se permanece más de 5 días el hotel ofrece un descuento del 10% por los días 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

días, y el tipo de cuarto y calcule el costo total.

Chimbote, Mayo del 200911.- COMPONENTES SWING

11.1 DEFINICIÓN:Cuando se empieza a utilizar Swing, se observa que JavaSoft ha dado un gran paso adelante respecto al AWT. Ahora los Componentes del interfaz gráfico son Beans y utilizan el nuevo modelo de Delegación 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 además, 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 cosmética de los interfaces gráficos de usuario.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 70

Page 71: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Son muchas las ventajas que ofrece el uso de Swing. Por ejemplo, la navegación con el teclado es automática, cualquier aplicación Swing se puede utilizar sin ratón, sin tener que escribir ni una línea de código adicional. Las etiquetas de información, o "tool tips", se pueden crear con una sola línea de código. Además, Swing aprovecha la circunstancia de que sus Componentes no están renderizados sobre la pantalla por el sistema operativo para soportar lo que llaman "pluggable look and feel", es decir, que la apariencia de la aplicación se adapta dinámicamente 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 compasión y, en la mayoría de los casos es suficiente con añadir 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 extensión 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 decisión de no volver a utilizar jamás un botón de AWT, pero, la funcionalidad básica de Swing descansa sobre el AWT. Todo esto es para evitar que el lector salte directamente a Swing, ya que sería conveniente que primero entendiese el AWT y cómo Swing mejora al AWT.

11.2 INTRODUCCIÓN:Para iniciar la entrada en Swing, qué mejor que implementar de nuevo otra versión del saludo inicial, pero con los componentes Swing, así que la versión del "Hola Mundo!", se convierte ahora en JHolaMundo.java, cuyo código 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 más en serio, también es muy sencillo y en él se pueden observar un poco mejor los cambios que introduce Swing, que son casi exclusivamente de nomenclatura.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 71

Page 72: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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();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 exceptúa la nueva sentencia import, el resto del código parece de AWT con una J delante de cada nombre de componente. Además, no se puede añadir algo con add() a un JFrame, sino

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 72

Page 73: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

que hay que tener antes su contenido, tal como muestra tanto este ejemplo, como el anterior del saludo. Pero, vamos, con una simple conversión se tiene toda la potencia de Swing.

Las dos imágenes anteriores corresponden a la captura de la ejecución 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 gráfica, diferente, en este caso el que JavaSoft llama Metal y que es el que por defecto se usa, aunque se puede también seleccionar el tipo de botones, cajas, textos, etc. con la apariencia de Window, Motif o Mac.

BORDES:La clase JComponent también contiene un método llamado setBorder(), que permite colocar diferentes bordes a un componente visible. El ejemplo java1402.java genera los diferentes tipos de borde que están disponibles y que se reproducen en la figura siguiente.

Para generar la ventana anterior, el código utiliza el método creaBorde() que crea un JPanel y le coloca un borde diferente en cada caso y, además, coloca el nombre del borde en medio del panel.import java.awt.*;import java.awt.event.*;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 73

Page 74: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

import com.sun.java.swing.*;import com.sun.java.swing.border.*;

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( new java1402(),BorderLayout.CENTER ); frame.setSize( 500,300 ); frame.setVisible( true ); }}

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 74

Page 75: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Muchos de los ejemplos que se desarrollarán usan el TitledBorder, pero el resto de los bordes son igual de fáciles de utilizar. También 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 selección, son uno de los componentes más básicos de todo interfaz de usuario, independientemente de que se hayan visto otros hasta ahora, o el lector difiera de esta clasificación. Y el más 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 más versátil que la clase correspondiente del AWT. En Swing, al derivar de JComponent, la clase JLabel implementa todas las características inherentes a los componentes Swing, como pueden ser los aceleradores de teclado, bordes, y demás. Si se echa un vistazo a los constructores de la clase JLabel, se puede observar claramente que Swing ofrece un API mucho más 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 características que permite Swing, como por ejemplo la utilización de gráficos, 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" ); JLabel etiq3 = new JLabel( "Etiqueta3", imagen,SwingConstants.CENTER ); etiq3.setVerticalTextPosition( SwingConstants.TOP ); add( etiq3 ); JLabel etiq4 = new JLabel( "Etiqueta4",SwingConstants.RIGHT ); add( etiq4 ); }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 75

Page 76: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 java1403(),BorderLayout.CENTER ); ventana.setSize( 300,150 ); ventana.setVisible( true ); }}

La figura siguiente es el resultado de la ejecución 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 tamaño de la imagen es el que determina el tamaño mínimo de la etiqueta.

El tipo de letra con que se presenta el texto de la etiqueta se puede cambiar fácilmente, basta con crear una nueva fuente de caracteres e invocar al método setFont() de la clase JLabel para que el cambio surta efecto. La fuente de caracteres puede ser cualquiera de las estándar, dentro de los tamaños soportados por la máquina virtual Java de la plataforma. El control de la fuente de caracteres utilizada para la etiqueta se puede realizar con una línea de código semejante a la siguiente:label.setFont( new Font( "Dialog",Font.PLAIN,12 ) );Los colores del texto y del fondo de la etiqueta también se pueden cambiar de forma muy sencilla, mediante la invocación de los métodos setForeground() y setBackground().

BOTONES:Swing añade varios tipos de botones y cambia la organización de la selección de componentes: todos los botones, cajas de selección, botones de selección y cualquier opción de un menú deben derivar de AbstractButton. El ejemplo java1404.java, muestra los diferentes tipos de botones que están disponibles ante el programador a través de Swing.import java.awt.*;import java.awt.event.*;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 76

Page 77: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 ); } } ); ventana.setSize( 300,200 ); ventana.setTitle( "Tutorial de Java, Swing" ); ventana.setVisible( true ); }}

La figura siguiente corresponde a la captura de la ejecución del programa anterior, y reproduce la apariencia de estos tipos de botones implementados por Swing.

El JButton parece igual que el botón que hay en el AWT, pero se pueden hacer muchas más cosas con él. Todos los botones, además, tienen ahora la posibilidad de incorporar imágenes a través del objeto Icon, que se puede asignar a cualquier tipo de botón. E incluso se pueden asignar varios iconos a un mismo botón para visualizar los diferentes estados en que pueda encontrarse dicho botón, tal como muestra la figura siguiente que corresponde a la captura de la ejecución del ejemplo java1405.java.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 77

Page 78: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

GRUPO DE BOTONES:Si se quieren botones de selección única, los conocidos como botones radio, que tienen la particularidad de que solamente puede haber uno seleccionado, hay que crearse un grupo de botones, añadiendo botones a ese grupo uno a uno. Pero, Swing permite que cualquier AbstractButton pueda ser añadido a un ButtonGroup.La figura siguiente muestra los grupos de botones con la apariencia correspondiente a Swing, según se obtiene la ventana tras la ejecución del ejemplo java1406.java, que crea varios paneles de botones.

Para evitar la repetición del código correspondiente a la incorporación de cada uno de los botones, en el ejemplo se utiliza la reflexión 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(), añade 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", };

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 78

Page 79: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

static JPanel creaPanelBotones( Class bClass,String ids[] ) { ButtonGroup botones = new ButtonGroup(); JPanel panel = new JPanel(); String titulo = bClass.getName(); 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 dinámico al que se pasa// una cadena como argumentoConstructor ctor = bClass.getConstructor( new Class[] { String.class } );// Se crea un nuevo objeto del tipo del botónbotonAbs = ( 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 ); } });

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 79

Page 80: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

frame.getContentPane().add( new java1406(),BorderLayout.CENTER ); frame.setSize( 600,300 ); frame.setVisible( true ); }}

El título se coge del nombre de la clase, eliminándole toda la información 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 excepción, todavía se pueda ver en la pantalla que hay problemas. El método 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 añade un poco de complejidad a lo que antes era un proceso muy simple, para conseguir que funcione el grupo con un único botón 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, marcándose y desmarcándose automáticamente, en función de la pulsación del ratón sobre el botón.

LISTAS Y CAJAS COMBINADAS:Las listas y cajas "combo" en Swing funcionan del mismo modo que lo hacían en el AWT, aunque tienen incrementada la funcionalidad a través 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 básico 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 ) ); 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 ); }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 80

Page 81: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 ejecución del ejemplo, y después de haber seleccionado uno de los elementos en la caja combo y abrirla para proseguir la selección de otra de las opciones o elementos que se permite elegir.

Una cosa que se ha mantenido con respecto a las listas de antes es que los objetos JList no proporcionan automáticamente la posibilidad de scroll o desplazamiento del contenido, que es una cosa que se espera que haga automáticamente, y resulta un poco chocante. No obstante, el añadir scroll a listas es sumamente sencillo, ya que es suficiente con incluir la JList en un JScrollPane, y todos los detalles del desplazamiento del contenido serán ya manejados bajo la responsabilidad del sistema.Aunque lo más frecuente es que cada elemento seleccionable de una lista sea una etiqueta, Swing proporciona al componente JList también la posibilidad de presentar gráficos, con o sin

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 81

Page 82: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

texto asociado, y también proporciona un control adicional de eventos para adecuarse a los que se producen en la manipulación de este tipo de Componentes. Es decir, que en una lista también se pueden incluir instancias de clases como JButton, JTextField, JCheckBox, e incluso JTextArea, que es un componente multilínea.Cada valor incluye el carácter de nueva línea, \n, para forzar el salto de línea 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 ) ); // 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 código es bastante simple, y la parte más 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 ejecución del ejemplo es el que muestra la figura.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 82

Page 83: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Aunque el componente JTextArea también tiene sus limitaciones, como son el no permitir el uso de gráficos, se puede observar que las posibilidades que se presentan al programador se han visto tremendamente incrementadas con la inclusión de este tipo de Componente y con las nuevas características que proporciona Swing. 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 también introduce nuevos componentes dentro de la manipulación de textos. Así la clase JTextArea actúa 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 método setEchoChar(), y la clase JTextPane que permite que se presente el texto con diferentes fuentes de caracteres, colores, tamaños, etc.El cambio de las características del texto que se presenta se realiza a través de estilos. Un estilo es un conjunto de características como son FontSize, ForegroundColor, isBold, isItalic, etc. y se manipula a través de constantes, como muestra la línea 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 línea se ha escrito nada más arrancar el programa, es decir, con el estilo por defecto de la aplicación, 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 introducción del texto.import java.awt.*;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;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 83

Page 84: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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; } 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 ) );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 84

Page 85: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

} 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( new java1409(),BorderLayout.CENTER ); ventana.setSize( 300,180 ); ventana.setVisible( true ); }}Swing también 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 método actionPerformed(), sin necesidad de intervención del programador. Estos receptores se pueden añadir 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 método llamado setToolTipText( String ). Así que se puede

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 85

Page 86: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

indicar un texto de información virtualmente en cualquier lugar y lo único que se necesita es invocar a este método, indicando el texto correspondiente al mensaje. Por ejemplo, el programa anterior se incorporaron dos mensajes de información 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 ratón permanezca sobre cada JButton, en este caso, pero JComponent en el caso más general, durante un periodo de tiempo predeterminado, una pequeña cajita conteniendo el texto aparecerá al lado del puntero del ratón, también en este caso, indicando en botón sobre el cual se encuentra situado el cursor del ratón.

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 ejecución de este último programa, cuando el ratón llevaba varios segundos sobre la imagen correspondiente al botón, con lo cual el mensaje incorporado como ToolTip al botón 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 indicándole el nombre del fichero, y ya se puede utilizar en el código 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" ),

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 86

Page 87: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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() { 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 );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 87

Page 88: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

} public static void main( String args[] ) { java1410 boton = new java1410(); JFrame ventana = new JFrame(); ventana.getContentPane().add( boton,BorderLayout.CENTER ); 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 también se puede utilizar el método setIcon() para añadir 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 botón: se pica, se deshabilita o se pasa el cursor por encima (sin pulsar ningún botón del ratón físico). Con esto se consigue proporcionar al botón la apariencia de encontrarse animado.

MENUS:Los menús están mucho mejor desarrollados y son más 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 también presentan los menús en el AWT, es decir, que hay que codificar los menús directamente y no hay soporte para, por ejemplo, recursos; que, entre otras cosas, facilitaría la conversión entre lenguajes de los textos de los menús. Así que, hay veces en que el código se hace demasiado largo y feo. En el ejemplo siguiente, java1411.java, se intenta dar un paso hacia la resolución de este problema colocando toda la información de cada menú en un array de elementos de tipo Object de dos dimensiones, para facilitar la introducción 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 características. Las filas del array no tienen por que ser uniformes, porque el código sabe perfectamente donde se encuentra, así que no importa que las filas sean completamente diferentes.import java.awt.*;import java.awt.event.*;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 88

Page 89: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 menús 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 selección 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 menús como si se tratara de los típicos // Recursos de X public Object menuArchivo[][] = { // Nombre del menú y tecla rápida asociada { "Archivo",new Character('A') },// Nombre, tipo, tecla rápida, 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 }, };

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 89

Page 90: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

public Object menuEdicion[][] = { // Nombre del menú y tecla rápida asociada { "Edicion",new Character('E') }, // Nombre, tipo, tecla rápida, 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 rápida asociada { "Iconos",new Character('I') }, // Se le añade 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 rápida asociada { "Opciones",new Character('O') }, // Nombre, tipo, tecla rápida, receptor asociado, habilitado o no { "Opcion 1",cb,new Character('1'),al1,bT }, { "Opcion 2",cb,new Character('2'),al1,bT }, }; public Object menuAyuda[][] = { // Nombre del menú y tecla rápida asociada { "Ayuda",new Character('y') }, // Nombre, tipo, tecla rápida, 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();

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 90

Page 91: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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; 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() {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 91

Page 92: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 ) {

System.exit( 0 ); } } ); ventana.setSize( 300,200 ); ventana.setTitle( "Tutorial de Java, Swing" ); ventana.setVisible( true ); }}

La intención del ejemplo anterior es permitir al programador el uso de tablas simples que representen a cada menú, en vez de que tenga que teclear líneas enteras para la construcción de esos menús. 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 opción del menú, que son: la cadena de caracteres que se colocará como opción, el tipo de opción de que se trata, la tecla aceleradora, el receptor de eventos de tipo Action que se disparará cuando la opción sea seleccionada y, finalmente, un indicador para saber si la opción está habilitada o no. Si una fila empieza por un carácter nulo, se tratará como un separador.Para evitar la tediosa creación de múltiples objetos booleanos y banderas, se han creado los valores estáticos 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 selección (cb) y elementos de selección ú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.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 92

Page 93: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

El ejemplo, cuya imagen en ejecución reproduce la figura anterior, también muestra como JLabels y JMenuItems, y sus descendientes, pueden manejar iconos. Un objeto Icon es colocado en JLabel a través 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 método creaMenuBarra(), que ya lo divide en los arrays individuales de datos del menú, pasando cada uno de estos últimos al método creaMenu(). Este método, por su parte, coge la primera línea del menú y crea un objeto JMenu a partir de ella, luego invoca al método creaMenuItem() para cada una de las siguientes líneas del array. Finalmente, el método creaMenuItem() chequea toda la línea 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 invocación del constructor de la forma:creaMenuBarra( barraMenu ); y ya todo se maneja de forma recursiva.

MENÚS POPUP:La implementación de JPopupMenu resulta un tanto extraña: antes de nada hay que llamar al método enableEvents() y seleccionar los eventos del ratón, en vez de utilizar un receptor de eventos como sería de esperar. Es decir, es posible añadir un receptor de eventos del ratón, pero el evento asociado, MouseEvent, no es capaz de devolver true desde el método isPopupTrigger(); aunque también puede que sea porque el JDK todavía 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:

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 93

Page 94: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Ante la llegada del evento correspondiente a la activación 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 ); } public static void main( String args[] ) { JFrame frame = new JFrame( "Tutorial de Java, Swing" );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 94

Page 95: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

frame.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } }); frame.getContentPane().add( new java1412(),BorderLayout.CENTER ); frame.setSize( 200,150 ); frame.setVisible( true ); }} El mismo ActionListener es el que se añade 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 información en forma de una barra parcialmente llena, o parcialmente vacía, 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 ejecución del programa, en donde se observa que la barra se ha desplazado al unísono que la escala, correspondiéndose en espacio.

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() {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 95

Page 96: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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( new java1413(),BorderLayout.CENTER ); frame.setSize( 200,150 ); frame.setVisible( true ); }}

La barra de progreso es muy simple de controlar, pero el objeto JSlider tiene una tremenda cantidad de opciones, que van desde la orientación hasta que las marcas sean más o menos grandes. Sin embargo, es sumamente sencillo, como se puede comprobar, incorporar un borde con título.El ejemplo java1428.java, es autónomo y lo que hace es crear un thread, cuando se pulsa el botón Arrancar, que va presentando en el campo de texto un número 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.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 96

Page 97: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

En el código solamente destacar la presencia de la clase anidada, que es la encargada de la actualización de la información, tanto de forma numérica en el campo de texto como de forma gráfico 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() ); 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();

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 97

Page 98: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

} } ); panelInferior.add( panelBotones ); add( panelInferior,BorderLayout.SOUTH ); } public void iniciaCuenta() { if( hilo == null ) { hilo = new ThreadCarga(); pideParar = false; hilo.start(); } } public void detieneCuenta() { 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;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 98

Page 99: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

} } 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( new java1428(),BorderLayout.CENTER ); frame.setSize( 400,150 ); frame.setVisible( true ); }}

ÁRBOLES: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 más 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 investigación y experimentación, antes de lograr los resultados deseados.Afortunadamente, como en el término medio está la virtud, en Swing, JavaSoft proporciona los árboles "por defecto", que son los que generalmente necesita el programador la mayoría 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 botón, se añade un nuevo sub-árbol a partir del nodo que está seleccionado; si no hay ninguno, se añade en el raíz.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 botón de testclass Rama { DefaultMutableTreeNode r; public Rama( String datos[] ) {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 99

Page 100: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 añade el árbol y se hace sobre un ScrollPanel, para que se controle automáticamente 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 añade el botón que va a ir incorporando ramas cada vez que se pulse JButton botonPrueba = new JButton( "Pulsame" ); botonPrueba.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { if( i < datos.length ) { rama = new Rama( datos[i++] ).node(); // Control de la útlima selección realizada seleccion = (DefaultMutableTreeNode) arbol.getLastSelectedPathComponent(); if( seleccion == null )

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 100

Page 101: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

seleccion = raiz; // El modelo creará el evento adecuado, y en respuesta a él, el árbol se actualizará // Automáticamente modelo.insertNodeInto( rama,seleccion,0 ); } } } ); // Cambio del color del botón botonPrueba.setBackground( Color.blue ); botonPrueba.setForeground( Color.white ); // Se crea un panel para contener al botón 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( new java1414(),BorderLayout.CENTER ); frame.setSize( 200,500 ); frame.setVisible( true ); }}

La figura siguiente muestra la ventana de ejecución del ejemplo, una vez pulsado el botón varias veces y con algunos de los sub-árboles desplegados.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 101

Page 102: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

En la aplicación, la primera clase, Rama, coge un array de String y genera uno de los nodos el árbol, con la primera cadena como raíz y el resto como sus hojas. Posteriormente, se pueden hacer llamadas al método node() para generar la raíz 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 través del array. Los objetos DefaultMutableTreeNode contienen los nodos, pero la representación física sobre la pantalla está controlada por la clase JTree y su modelo asociado, el DefaultTreeModel. Cuando el JTree se incorpora al Frame, es incrustado automáticamente en un JScrollPane, para proporcionar desplazamiento o scroll automático al árbol.El JTree está controlado a través 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 representación visible del árbol. En el método init(), en el caso de un applet, o en el constructor, en el caso más general, el modelo que se utiliza es capturado a través del método getModel(). Cuando se pulsa un botón, se crea una nueva rama. Entonces, el Componente seleccionado actual será encontrado (o se convertirá en el raíz, en el caso de que no se encuentre) y el método 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 mayoría de los problemas de implementación 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 intríngulis de los árboles.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 102

Page 103: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Ya en la discusión 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 también soportan estos modelos, aunque en este caso, debido a la naturaleza jerárquica de los árboles, el modelo es bastante más 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 presentación y manipulación de cada uno de los elementos de las ramas del árbol.En el código 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" ); 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();

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 103

Page 104: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

this.seleccionado = seleccionado; // Se fija el color de fondo en función 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] ); 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 continuación del icono, ponemos el texto setText( texto ); return( this); }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 104

Page 105: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

// Sobreescribimos el método 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 limitación // En el TreeCellRenderer, es necesario recurrir al método paint() para hacer esto public void paint( Graphics g ) { Color color; Icon currentI = getIcon(); // Fijamos el colos de fondo color = seleccionado ? Color.red : Color.white; g.setColor( color ); // Rellenamos el rectángulo que ocupa el texto sobre la celda del árbol g.fillRect( 0,0,getWidth()-1,getHeight()-1 ); super.paint( g ); } }La ejecución del ejemplo, genera una imagen como la que se reproduce a continuación, en donde se ha desplegado una de las ramas del árbol y se ha seleccionado uno de sus elementos.

La clase principal de la aplicación crea un árbol que contiene a cada una de las cartas en uno de los palos de la baraja, y no tiene más 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 inclusión de gráficos o cualquier cambio, como el de la fuente de caracteres, en elementos específicos del árbol. Por ejemplo, puede resultar interesante en una aplicación, el presentar los elementos de un nivel superior en negrilla para resaltar su importancia, o se puede querer añadir una imagen para ser más explicativos. Cualquier cosa de estas, se puede implementar a través 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, también se les ha añadido el gráfico que las representa. Y en el código, lo único especial es la línea en la

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 105

Page 106: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

cual se le notifica al árbol que dispone de un controlador propio e independiente para la manipulación de las celdas o elementos del árbol.arbol.setCellRenderer( new MiRendererDeArbol() );La clase anidada implementa un constructor para la carga de las imágenes, a fin de ahorrar tiempo a la hora de la ejecución. El método getTreeCellRendererComponent(), que debe ser proporcionado a requerimiento de la implementación de la clase TreeCellRenderer utilizada por la clase anidada, es el responsable del dibujo de los elementos del árbol. En este caso, este método determina cuál es la imagen que corresponde al elemento del árbol, basándose en el texto asociado al elemento, y le asigna el icono correspondiente. Además, fija el color de fondo de la celda que contiene al elemento, en función 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 método de la clase que implementa el modelo, o por lo menos, si se hace así no tiene efecto alguno. Puede que sea una limitación 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 método 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 través 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 características como para montar desde una hoja de cálculo básica hasta información para escribir un libro completo. Sin embargo, también es posible crear una JTable relativamente simple si entiende correctamente el funcionamiento.La JTable controla cómo 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 más simple heredar de la clase ayuda AbstractTableModel. El ejemplo java1416.java muestra esta circunstancia.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 ellaclass 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

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 106

Page 107: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

// 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 número de columnas de la tabla public int getColumnCount() { return( datos[0].length ); } // Devuelve el número de filas de la tabla public int getRowCount() { return( datos.length ); } // Devuelve el valor de una determinada casilla de la tabla // 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 añade a un ScrollPane para que sea éste el que controle automáticamente en

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 107

Page 108: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

// Tamaño 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( new java1416(),BorderLayout.CENTER ); frame.setSize( 200,200 ); frame.setVisible( true ); }}

En el ejemplo, para no complicar la cosa, DataModel es quien contiene el conjunto de datos, pero también se podrían haber cogido de una base de datos. El constructor añade 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 métodos utilizan la notación de los Beans y son utilizados por el objeto JTable cuando se quiere presentar la información del DataModel. AbstractTableModel proporciona por defecto los métodos setValueAt() y isCellEditable() que se utilizan para cambiar los datos, por lo que si se quiere realizar esta operación, no queda más remedio que sobrescribir los dos métodos.La figura siguiente muestra la Tabla obtenida tras la ejecución 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 sólo resta colocarlo en el constructor de JTable. Todos los detalles de presentación, edición y actualización están ocultos al programador. En este ejemplo, se coloca la JTable en un JScrollPane, por lo que es necesario un método especial en JTable.Las tablas pueden soportar un comportamiento más complejo. En el ejemplo java1417.java, se utiliza un método para cargar un array de ocho columnas por un ciento de filas y, posteriormente, la tabla es configurada para que muestre solamente las líneas verticales y permita la selección simultánea de la fila y columna en que se encuentre la celda marcada. import java.awt.*;import java.awt.event.*;import java.util.*;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 108

Page 109: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

import com.sun.java.swing.*;import com.sun.java.swing.table.*;

class java1417 extends JPanel { private JTable tabla; private JScrollPane panelScroll; 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 parámetros 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 automática panelScroll = new JScrollPane( tabla ); add( panelScroll, BorderLayout.CENTER ); } // Creamos las etiquetas que sirven de título 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]; for( int iY=0; iY < 100; iY++ ) { for( int iX=0; iX < 8; iX++ ) {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 109

Page 110: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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( new java1417(),BorderLayout.CENTER ); ventana.setSize( 300,180 ); ventana.setVisible( true ); }}

La figura siguiente muestra el resultado de la ejecución del ejemplo. Obsérvese que cuano se selecciona un elemento individual de la tabla, aparece una selección 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 región seleccionada se han alterado, que es otra de las facilidades que soporta el componente JTable, el cambio de color para un área de selección.

Aunque el ejemplo contiene un array relativamente grande de datos, la clase JTable no manipula grandes cantidades de información, resultando un rendimiento bastante pobre cuando se sobrepasan los 2000 elementos.

PESTAÑAS:

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 110

Page 111: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

En otra sección del Tutorial se introduce el controlador de posicionamiento de Componentes CardLayout, y se explica y muestra cómo puede manejar diferentes fichas o tarjetas. No es un mal diseño, pero Swing introduce algo mucho más interesante y flexible, el JTabbedPane, que puede manejar directamente todas las fichas, a base de pestañas 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 }, { "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],

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 111

Page 112: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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( new java1418(),BorderLayout.CENTER ); frame.setSize( 460,350 ); frame.setVisible( true ); }}

Se ha utilizado un array para la configuración: el primer elemento es el objeto String que será colocado en la pestaña 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 métodos importantes del JTabbedPane: addTab() que crea una nueva pestaña 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 capítulo.

En la llamada al método addTab() se le proporciona la cadena que debe colocar en la pestaña 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 ningún control posterior, el JTabbedPane se encarga de todo.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 112

Page 113: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

El trozo más interesante del código del ejemplo es el correspondiente al método creaPanel() que coge el objeto Class de la clase que se quiere crear y utiliza el método newInstance() para crear uno, moldeándolo a JPanel; desde luego, esto asume que la clase que se quiere añadir debe heredar de JPanel, sino no serviría de nada. Añade un 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 también proporciona nuevos modelos de diálogos predefinidos del sistema, como son en diálogo de selección de colores, el diálogo de selección de ficheros, diálogos de aviso, error y confirmación, y algunos más. La apariencia es muy distinta a la que se presentaba en el AWT en algunos casos, por ejemplo en la selección de ficheros.La ventana que permite la selección de ficheros, suele ser una ventana modal, ya que los cambios que se produzcan en ella, o la selección que se haga, repercutirá en el funcionamiento de la aplicación general. Normalmente, la ventana de selección de ficheros se utiliza para presentar una lista de ficheros y permitir al usuario seleccionar cuál de ellos debe abrir la aplicación; o, por el contrario, permitir al usuario la introducción de un nombre o selección 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 acción; es responsabilidad del programa el llevar a cabo la apertura del fichero o la grabación de datos.Tal como se muestra en la figura siguiente, generada tras la ejecución del ejemplo java1419.java y realizado un montaje de las dos selecciones obtenidas tras la pulsación de cada botón presente en la ventana, se puede observar que la mejora que se ha incorporado a Swing es sustancial, en comparación con su opción en AWT.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 113

Page 114: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Además, 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 diálogo de confirmación, utilizando el que por defecto proporciona Swing, del mismo modo que en los ejemplos siguientes se usan algunos de los demás diálogos 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 ) respuesta = "Si"; else respuesta = "No"; System.out.println( "Respuesta: "+respuesta ); }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 114

Page 115: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 diálogo que va a presentar un mensaje y dos botones, uno para confirmación, en cuyo caso devuelve el Panel como respuesta la constante YES_OPTION, y otro para la desestimación.

Así el ejemplo java1421.java utiliza el diálogo de aviso y en el ejemplo java1422.java se emplea el diálogo predefinido que permite introducir datos, y que resulta extremadamente útil cuando no se desea implementar ningún interfaz de entrada, por ejemplo a la hora de pedir contraseñas de acceso, en que no merece la pena el desarrollo de ventanas específicas para tal acción. Las figuras siguientes muestran ejemplos de estos dos diálogos predefinidos en Swing.

TECLADO:Algunas de las clases de Java proporcionan métodos de conveniencia para permitir realizar acciones a través del teclado. Por ejemplo, la clase AbstractButton dispone del método setMnemonic(), que permite especificar el carácter, que en combinación con una de las teclas de modificación (dependiendo del Look-and-Feel que se esté utilizando), hace que se ejecuten las acciones asociadas a los botones. Esta característica es muy útil en los menús, 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 métodos. En la ventana aparecerán nueve botones, tal como muestra la figura siguiente.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 115

Page 116: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Si se pulsan las teclas correspondientes a los cursores, la X que aparece sobre los botones se desplazará en la dirección correspondiente al botón 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 ); 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;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 116

Page 117: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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; } 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 automática de desplazar el contenido de una ventana por parte del sistema. Esta clase permite dejar las manos libres al programador para centrarse en el código de su aplicación, 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 aplicación un poco más avanzada para mostrar cómo interactúa en un programa.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 117

Page 118: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Además, 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 gráfico, para ilustrar el hecho de que el contenido de los paneles de desplazamiento puede ser cualquiera que se elija.El código del ejemplo se muestra a continuación y debería resultar sencillo de entender al lector, aunque hay algunos trozos sobre los que merece la pena detenerse y se comentarán a continuación.import java.io.*;import java.awt.*;import java.awt.event.*;import com.sun.java.swing.*;import com.sun.java.swing.event.*;

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 gráfico creaPanelInf(); // Se crea un panel dividido verticalmente panelVert = new JSplitPane( JSplitPane.VERTICAL_SPLIT ); add( panelVert,BorderLayout.CENTER ); // Se incorporan las dos zonas que se habían 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 posición 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;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 118

Page 119: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

if( dim1.width > dim2.width ) {escalaX = (float)dim1.width / (float)dim2.width;escalaY = (float)dim1.height / (float)dim2.height;// Escalamos en función del movimientopoint.x /= escalaX;point.y /= escalaY;

} else {

escalaX = (float)dim2.width / (float)dim1.width;escalaY = (float)dim2.height / (float)dim1.height;// Escalamos en función del movimientopoint.x *= escalaX;point.y *= escalaY;

} // Movemos la otra vista en función 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 gráfico, o imagen , en la panatalla Icon imagenP2 = new ImageIcon( "main.gif" ); JLabel etiqP2 = new JLabel( imagenP2 ); // Creamos el panel para el gráfico

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 119

Page 120: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

panelScro2 = new JScrollPane(); panelScro2.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER ); panelScro2.setHorizontalScrollBarPolicy( 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( new java1424(),BorderLayout.CENTER ); ventana.setSize( 460,300 ); ventana.setVisible( true ); }}

Los métodos que se usan para crear el contenido de los subpaneles es complicado. El método creaPanelSup(), se limita a utilizar un componente JTextArea sobre el que carga el fichero que contiene el código fuente del ejemplo. y el método creaPanelInf() presenta una imagen que se desplazará en consonancia con el movimiento del panel superior.Sin embargo, sí que hay un trozo de código interesante en el método stateChanged(), que controla los cambios producidos por acción del usuario, y es el cálculo de la escala que diferencia a los dos paneles de desplazamiento. En el programa, el cálculo de la escala no es demasiado preciso, debido a que no tiene en cuenta del todo el tamaño de los dos paneles. Si se mueve la barra horizontal en el panel superior se puede observar esta circunstancia. Con un poco más de matemáticas por parte del lector, seguro que podrá compensar el error, y a su ejercicio se deja esa corrección, simplemente indicando que hay que experimentar con los métodos getViewPosition() y getExtentSize() de la clase JViewport para conseguir que los cálculos sean correctos.Cuando se ejecuta el programa y se agranda la ventana, se puede ver una imagen semejante a la que reproduce la imagen siguiente.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 120

Page 121: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 práctico, pero muestra cómo 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 más grande que el tamaño de la subventana. Las líneas de código siguientes: panelScro2.setVerticalScrollBarPolicy( ScrollPaneConstants.VERTICAL_SCROLLBAR_NEVER ); panelScro2.setHorizontalScrollBarPolicy( ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );Son las que permiten fijar las características 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 selección, listas, etc.Java utiliza el interfaz gráfico de la plataforma sobre la que se está ejecutando para presentar los Componentes del AWT con el aspecto asociado a esa plataforma, de este modo los programas que se ejecuten en Windows tendran esa apariencia y los que se ejecuten en Unix tendrán apariencia Motif. Pero Swing permite la selección de esta apariencia gráfica, 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 método 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 tamaño, etc. para ese JComponent.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 121

Page 122: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Una de las ventajas que representan las capacidades de Look&Feel incorporadas a Swing para las empresas, es el poder crear un interfaz gráfico estándar y coporativo. Con el crecimiento de las intranets se están soportando muchas aplicaciones propias que deben ejecutarse en varias plataformas, ya que lo más normal es que en una empresa haya diferentes plataformas. Swing permite ahora que las aplicaciones porpias diseñadas para uso interno de la empresa tengan una apariencia exactamente igual, independientemente de la plataforma en que se estén ejecutando. Y es que hay pequeñas cosas que vuelven loco al usuario al cambiar de entorno, por ejemplo: ¿Ratón 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, geografía, efectos...

En la imagen se puede observar una revisión gráfica de los interfaces de usuario más utilizados actualmente.

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 código Java, con AWT, se puede desarrollar y probar completamente sobre una plataforma, pero debido a las diferencias entre las máquinas virtuales de las distintas plataformas o sistemas operativos, se pueden presentar desde pequeños problemas de presentación gráfica hasta grandes incosistencias, que pueden llegar a que la aplicación caiga durante la ejecución o, sencillamente, que no arranque. Con Swing, estos problemas van a quedar relegados a la historia y, se contarán como anécdotas. Utilizando las librerías 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.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 122

Page 123: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 123

Page 124: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

En general, para la implementación 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 diseño de un interfaz gráfico; los usuarios que ya están utilizando el ordenador están acostumbrados a lo que les ofrece la plataforma con la que trabajan, y el interfaz que se diseñe 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 diseño. Por lo tanto, se debe utilizar con cautela el poder que pone en manos de los programadores/diseñadores la posibilidad de desarrollar un Look&Feel propio.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 124

Page 125: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 más importante que el borde, es decir, que no tiene por qué haber un borse separando todos los elementos. Además, 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 más comunes en los entornos gráficos más utilizados actualmente.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 125

Page 126: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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

En versiones anteriores de Swing, también se proporcionaba el entorno Organic, en dos versiones, Santa Fe y Vancouver. La imagen siguiente reproduce un ejemplo del entorno Organic Santa Fe.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 126

Page 127: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Y el ejemplo que aparece a continuación, representa la apariencia que ofrecía el Look&Feel Organic Vancouver.

El Look&Feel Metal, que se ha utilizado en casi todos los ejemplos de este capítulo, 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. Además 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 imágenes de la página.

LOOK AND FEEL FLECHA:Y, ahora llega el momento de crear un Look&Feel propio. Para los lectores más inquietos y que dispongan de una gran dosis de paciencia y, realmente, necesiten hacerlo, a continuación se indica cómo se puede crear un nuevo Look&Feel para incorporarlo a Java. La mayoría de los

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 127

Page 128: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

usuarios y programadores, seguro que estarán más que satisfechos con los que proporciona Java por defecto, pero como Swing proporciona la posibilidad de controlar todo el interfaz, a los diseñadores les resultará de utilidad toda esta información.Se va a crear un nuevo Look&Feel llamado flecha, del cual solamente se va a diseñar uno de los Componentes del interfaz, concretamente el Botón; los demás componentes se implementarían de forma similar, siempre teniendo en cuenta las características 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 triángulos a cada lado del texto, en forma de flecha, que cambiarán de color en función del estado en que se encuentre el botón.La imagen siguiente reproduce la ejecución del ejemplo java1426.java, que utiliza este nuevo Look&Feel, en el que se puede observar el nuevo JButton que se ha creado, y los demás Componentes del interfaz, que corresponden al Look&Feel Metal, que es el que se ha utilizado como partida para la implementación del Look&Feel Flecha.

También se puede utilizar como partida cualquier otra de las apariencias que proporciona Java, o crearse el nuevo Look&Feel desde cero. La opción más 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 ejecución del mismo ejemplo pero utilizando el Look&Feel Motif como partida para la creación del nuevo Look&Feel y la implementación del JButton.

Para la implementación de este Look&Feel se utiliza el paquete flecha, que está generado a partir de los ficheros fuente FlechaLookAndFeel.java, FlechaButtonUI.java, FlechaButtonListener.java y FlechaButtonBorder.java. El comportamiento del botón no se altera, solamente se cambia la apariencia y la respuesta del botón a las acciones del ratón se adecúan a la nueva imagen del JButton.El código 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 {

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 128

Page 129: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

public java1426() { // Se crea el botón 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 ); add( botonFlecha ); }

public static void main( String args[] ) { JFrame ventana = new JFrame( "Tutorial de Java, Swing" );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 129

Page 130: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

ventana.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { System.exit( 0 ); } }); ventana.getContentPane().add( new 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 complicación, ya que al extender clases ya implementadas en los paquetes de Java, solamente hay que modificar aquellos comportamientos que deban adecuarse a la nueva situación que se cree con el Componente nuevo. Por ejemplo, en la clase FlechaLookAndFeel, lo único necesario es mapear las cosas que se necesitan hacer con la clase nueva, para que los métodos 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 método 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" ); }

public String getName() { return( "Flecha Look and Feel" ); }

public String getDescription() { return( "Look and Feel Flecha, Tutorial de Java" ); }

public boolean isNativeLookAndFeel() { return( false ); }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 130

Page 131: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 idénticas, con excepción del método paint(); en el resto de los métodos comunes los cambios son mínimos. En el caso concreto del botón que se está creando, son necesarias dos clases de soporte: la clase FlechaButtonBorder que va a pintar los bordes del botón y la clase FlechaButtonListener, que va a deteminar la forma de respuesta que tendrá el botón ante las acciones del ratón 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;

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 );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 131

Page 132: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

}

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();

Dimension tamano = ab.getSize(); g.setFont( c.getFont() ); FontMetrics fm = g.getFontMetrics();

// Desplazamiento que se aplica al texto e iconos cuando se pulsa el botón, 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; }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 132

Page 133: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

// Se pinta el fondo del botón, que es en color plano, pero se le podría 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(); } 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 título del botón 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(),

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 133

Page 134: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 ) ); }

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 rectBoton = new Rectangle( Short.MAX_VALUE,Short.MAX_VALUE ); 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 unión del rectángulo 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;

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 134

Page 135: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

return( rect.getSize() ); }

public Insets getDefaultMargin( AbstractButton b ) { return( margenDefecto ); }

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 métodos installUI(), uninstalUI() y createUI(), deberían ser los únicos que sorprendiesen al lector, porque los demás ya se han visto en ejemplos anteriores hasta la saciedad. Estas rutinas de instalación tienen como cometido básico el instalar el nuevo borde y el nuevo receptor de eventos que se han creado específicamente para el botón que se implementa. Por supuesto, el método paint() pinta el objeto y el resto del trabajo se deja para la clase que controla el borde del botón.El código del receptor de eventos, si no se están haciendo cosas específicas con el teclado o a la hora de recibir el foco, debería ser muy semejante, e incluso compartido, entre múltiples objetos. Básicamente, lo que se le dice es lo que debe hacer: la pulsación del ratón hará que el botón 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 muñeco saludando antes de que el botón se active, pues no hay problemas en hacerlo, se puede perfectamente. En el caso del objeto FlechaButtonUI se admiten solamente los eventos de ratón 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; }

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 135

Page 136: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 ) ab.getModel().setRollover( false ); }}Finalmente, la clase FlechaButtonBorder es la clase que le da la apariencia nueva al botón. El borde habitual es sustituido por dos triángulos a los lados del texto, y también, en función del estado del botón, se cambiará el color de estos triángulos.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 136

Page 137: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

EJEMPLO SWING:Este es un ejemplo más útil que cualquiera de los que se han visto en este capítulo, y aunque no llega a la complejidad de la aplicación SwingSet, que se distibuye con Swing, tampoco tiene las características sofisticadas de multiclase (multifichero), que hacen el aprendizaje bastante penoso, por lo que se debe empezar con cosas más simples.El ejemplo java1427.java, es un simple programa de conversión de temperaturas entre Fahrenheit y Centígrados, 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 centígrados. La primera opción de la barra del menú, abre un menú de opciones que permite realizar la conversión en un sentido o en otro. La segunda opción de la barra del menú hace que el Look&Feel de la aplicación 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 aplicación.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 137

Page 138: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

Cuando se desplaza la posición del marcador de la escala con el ratón, la otra escala se actualiza inmediatamente para reflejar la misma temperatura en la otra unidad de medida.El código del programa es bastante simple, a pesar de resultar de cierta utilidad; lo cual representa otro ejemplo de como pequeños 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 indicanpublic class java1427 extends JFrame implements ActionListener, SwingConstants, ChangeListener { // Modos de funcionamiento, o de conversión private static final int MODO_F2C = 1; private static final int MODO_C2F = 2; // Valores máximos y mínimos 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; 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

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 138

Page 139: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

// 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 conversión se añaden a la barra // Superior opcionF2C = new JCheckBoxMenuItem( "Conversion Fahrenheit a Centigrados",true ); opcionC2F = new JCheckBoxMenuItem( "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 añaden 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 añade 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

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 139

Page 140: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 numérico correspondiente a la conversión // o al valor convertido panelFH = new JPanel(); panelFH.setBorder( new TitledBorder( "Fahrenheit" ) ); panelFH.setLayout( new BoxLayout( panelFH, BoxLayout.Y_AXIS ) ); 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 // Centígrados, situando en la parte inferior una etiqueta con el valor numérico correspondiente// A la conversión 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 );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 140

Page 141: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

// Se fuerzan las barras de desplazamiento a que se inicialicen a valores predefinidos //fahrenheit.setValue( FMAX ) ; } // Control del cambio de valor en las barras de desplazamiento. Se detecta el cambio en una y, // Por simpatía 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 Centígrados 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á controlándose solamente cuando el // Usuario cierra la ventana, para concluir ejecución la aplicación, el resto se pasan hacia arriba // En el árbol jerárquico public void processEvent( AWTEvent evt ) { if( evt.getID() == WindowEvent.WINDOW_CLOSING ) { System.exit( 0 );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 141

Page 142: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

} else { super.processEvent( evt ); } }

/* Este método es el que controla la acción por la cual se ha demostrado interés, que en este caso Concreto es la opción que se selecciona entre las dos que presenta la barra de menú y que Permite que la conversión de temperaturas sea en una dirección u otra y también 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 conversión 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 rb = (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 // 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" );

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 142

Page 143: Manual de Fdp1

Autor: Mg. Ing. Javier Martínez Carrión

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 botón correspondiente ala opción del menú una mejora sería 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_CURSOR ) ); } } static public void main( String args[] ) { MiFrame = new java1427(); MiFrame.setSize( 300,300 ); MiFrame.setBackground( Color.lightGray ); MiFrame.show(); }}El código no merece la pena comentarlo, ya que todos los métodos se han visto en ejemplos anteriores, en este caso lo único que se ha hecho ha sido reunirlos todos en una aplicación un poco más útil que los simples ejemplos que muestran el uso de cada uno de los Componentes de Swing.

Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote Página Nº 143