Subido por Manuel Altamirano

Manual de FDP

Anuncio
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
UNIVERSIDAD SAN PEDRO
FACULTAD DE INGENIERIA
ESCUELA PROFESIONAL DE INGENIERIA INFORMÁTICA Y DE SISTEMAS
CURSO
:
FUNDAMENTOS DE PROGRAMACIÓN
CICLO
:
II
SEMESTRE:
2013-I
DOCENTE :
Ing. MARTINEZ CARRIÓN JAVIER (Mg. Dr.)
Chimbote, Abril 01 del 2013
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 1
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
INDICE GENERAL
Capítulo I: Programación Orientada a Objetos
1.-
2.
Programación Orientada a Objetos
……………..
5
1.1
………………
6
1.2. Diferencias con la Programación Estructurada
………………
6
1.3. La Programación Orientada a Objetos
………………
7
Características de la Programación Orientada a Objetos
………………
8
2.1
Abstracción
………………
8
2.2
Encapsulamiento
………………
8
2.3
Principio de Ocultamiento
………………
8
2.4
Polimorfismo
………………
9
2.5
Herencia
………………
9
Origen
3.
Características del Java
………………
10
4.
Netbeans
………………
11
4.1
Historia
………………
12
4.2
Netbeans Hoy
………………
13
4.3
La Plataforma Netbeans
………………
13
4.4
Netbeans IDE
………………
14
4.5
Instalación de Netbeans
………………
15
4.6
Ejecutar Netbeans
………………
16
4.7
Versiones de Netbeans
………………
16
Variables, Tipos de Datos, Operadores y Expresiones
………………
17
5.1
Tipos de Datos
………………
17
5.2
Tipos Referenciados
………………
17
5.3
Variables
………………
17
5.4
Operadores
………………
18
Capítulo II: Sentencias de Control de Flujo
5.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 2
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
6.
Sentencia de Control de Flujo
………………
20
6.1
Sentencia if
………………
20
6.2
Sentencia if else
………………
20
6.3
Sentencia switch case
………………
21
6.4
Sentencia Repetitiva while
………………
23
6.5
Sentencia Repetitiva for
………………
24
6.6
Sentencia Repetitiva do while
………………
24
6.7
Manejo de Escepciones
………………
24
Capítulo III: Trabajando con Java NetBeans
7.
Creación de Proyecto en Netbeans
………………
25
8.
Desarrollo de Programas: Secuenciales, Selectivas y Repetitivas
………………
30
Laboratorio Propuesto Nº 01
………………
39
Laboratorio Propuesto Nº 02
………………
41
Clases
………………
44
9.1
Introducción
………………
41
9.2
Atributos
………………
41
9.3
Comportamiento
………………
41
9.4
La Clase
………………
42
9.5
Los Miembros Datos
………………
42
9.6
Las Funciones Miembro
………………
42
Los Constructores
………………
48
10.1 Los Objetos
………………
51
10.2 Acceso a los Miembros
………………
51
10.3 La vida de un Objetos
………………
52
10.4 Identificadores
………………
53
Los Métodos
………………
54
11.1 Definición
………………
54
Capítulo IV: Clases, constructores y Métodos
9.
10.
11.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 3
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
12.
11.2 Métodos de la Clase Math
………………
57
Desarrollo de Programas ejemplos
………………
60
Laboratorio Propuesto Nº 03
………………
67
Laboratorio Propuesto Nº 04
………………
71
Laboratorio Propuesto Nº 05
………………
72
Applet – Componentes Swing
………………
76
13.1 Definición
………………
76
13.2 Introducción
………………
76
Capítulo V: Componentes Swing
13.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 4
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
CAPITULO I: PROGRAMACIÓN ORIENTADA A OBJETOS
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.
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 5
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 6
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 7
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 específica cómo pueden interactuar con los
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 8
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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++
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 9
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
 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)
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 10
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)

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 2
JAVA Y SUS TECNOLOGÍAS
Existen 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.
 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.-
NETBEANS
Se refiere a una plataforma para el desarrollo de aplicaciones de escritorio usando Java y a un Entorno
integrado de desarrollo (IDE) desarrollado usando la Plataforma NetBeans.
La plataforma NetBeans permite que las aplicaciones sean desarrolladas a partir de un conjunto de
componentes de software llamados 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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 11
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 12
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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).
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 13
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
4.4

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).
NETBEANS IDE
El IDE NetBeans es un IDE - una herramienta para programadores pensada para escribir,
compilar, depurar y ejecutar programas. Está escrito en Java - pero puede servir para cualquier
otro lenguaje de 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óviles
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 14
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
El 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.html
El 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 7.3
A continuación se darán las instrucciones de como instalar NetBeans 7.3 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 7.3. 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 (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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 15
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
 INSTALACIÓN EN LINUX
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.
4.6
EJECUTAR NETBEANS IDE 7.3
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
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 16
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
CAPÍTULO II: SENTENCIAS DE CONTROL
6.
VARIABLES, TIPOS DE DATOS, OPERADORES Y EXPRESIONES:
Se esta considerando los siguientes temas.
6.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 byte
Short 16
– bit complemento a 2
Entero corto
Int 32
– bit complemento a 2
Entero
Long 64
– bit complemento a 2
Entero largo
(Números reales)
Float 32
– bit IEEE 754 Coma flotante de precisión simple
Double 64
– bit IEEE 754 Coma flotante de precisión simple
(otros tipos)
6.2
Char 16
– bit Carácter
Un solo carácter
boolean
True o false
Un valor booleano (verdadero o falso)
TIPOS REFERENCIADOS
Los tipos referenciados se llaman así porque el valor de una variable de referencia es una
referencia (un puntero) hacia el valor real. En Java tenemos los arrays, las clases y los interfaces
como tipos de datos referenciados.
6.3
VARIABLES
Un 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.
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 17
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
6.4
OPERADORES
Los operadores realizan algunas funciones en uno o dos operadores .los operadores que
requieren un operador se llaman operadores usuarios .Por ejemplo, ++ es un operador usuario
que incrementa el valor su operando en uno.
Los operadores que requieren dos operando se llaman operadores binarios.
El operador = es un operador binario que asigna un valor del operando derecho al operando
izquierdo.
Los operadores usuarios en Java pueden utilizar la 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 operador
Todos los operadores binarios de java tienen la misma notación, es decir aparecen entre los dos
operandos:
op1 operador op2
El 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 + b
O este código para calcular el resto de una división:
c%d
Esta 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
El lenguaje Java extiende la definición del operador + para incluir la concatenación de cadenas
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 18
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Los operadores + y – tienen versiones unarias que seleccionan el signo del operando:
Operador
Uso
Descripción
+ + op
Indicar un valor positivo
- - op
Niega el operando
Ademá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ónales
Operadores
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ón
Se 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+2
Puedes 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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 19
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
%= 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ógicos
Operador Uso Devuelve true si && op1 && op2 Op1 y op2 son verdaderos | | op1 | | op2 Uno
de los dos es verdadero ! ! op Op es falso
Ejemplo: Verificando si la nota esta en el intervalo cerrado [0, 20]
If ( nota >0 && nota<= 20)
{
……
……
}
Ejemplo:
1)
Construir la 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+1
Respuesta: 22
6.-
SENTENCIA DE CONTROL DE FLUJO
Estamos considerando a las siguientes:
6.1
LA SENTENCIA IF
if (Condición)
{
/ / instrucciones que es ejecutan solo cuando Condición es true
}
6.2
LA SENTENCIA IF – ELSE
if (respuesta == OK)
{
…
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 20
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
/ / 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 else
int nota;
String mensaje = null;
if (nota >=90)
{ mensaje = “Sobresaliente”;
}
else
if (nota >= 80)
{ mensaje = “Notable”; }
else
if (nota >=70)
{ mensaje = “Bien”; }
else
6.3
if (nota >= 60)
{ mensaje = “Suficiente”;}
else
{ mensaje = “ Insuficiente”;
}
LA SENTENCIA SWITCH
La sentencia switch se utiliza para realizar sentencias condicionalmente basadas en algunas
expresión.
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: System.out.println (“Mayo”);
break;
Case 6: System.out.println (“Junio”);
break;
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 21
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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:
Numerodias = 31;
break
Case 11:
Numerodias = 30;
break;
Case 2:
If (((anio % 4 == 0) && !( anio % 100 == 0)) | | anio % 400 == 0))
Case 4:
Case 6:
Case 9:
numerodias = 29;
else
NumeroDias = 28;
break
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 22
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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:
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 23
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 EXCEPCIONES
Cuando 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º 24
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
CAPÍTULO III: TRABAJANDO CON JAVA NETBEANS
7.
CREACIÓN DE PROYECTO EN NETBEANS
A continuación se da nociones básicas de cómo crear, compilar y ejecutar un proyecto.
Paso 1: Crear una carpeta en una unidad de Almacenamiento, puede ser disco duro, memoria USB,
etc. La carpeta creada para este ejemplo es FDP
Paso 2: Ingresar al Java Netbeans 7.3
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 25
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Paso 3: Haz Clic en FILE y selecciona NEW PROJECT
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 26
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Paso 4: Haz Clic en Next
Paso 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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 27
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Paso 6: Cuando aparece esta pantalla debemos de ubicar la carpeta FDP
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 28
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Paso 7: En Nombre de Proyecto escribirmos Ejemplo001, luego debemos de hacer Clic en Finish
Paso 8: A continuación debemos de empezar a programar
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 29
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
8.
DESARROLLO DE PROGRAMAS EJEMPLOS
TEMAS: SECUENCIALES – SELECTIVAS (SIMPLE, DOBLE, MÚLTIPLE)
1. /* Desarrolle un programa en Java que muestre algunos datos de usuario */
package ejercicio001;
public class ejemplo001
//Nombre del Proyecto
//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);
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 30
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 Proyecto
import java.io.*;
public class Ejemplo003
{
public static void main(String arg[]) throws IOException
{
float sol,con,dol;
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
System.out.println("Ingreso el Monto en Soles:");
sol=Float.parseFloat(br.readLine());
System.out.println("Ingreso el Tipo de Cambio:");
con=Float.parseFloat(br.readLine());
dol=sol/con;
System.out.println("El Monto en Dolares es:"+dol);
}
}
4. /* Calcula y Reporta la Sumatoria de todos los números comprendidos de 1 hasta n. Debes de
ingresar el valor de n */
package 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);
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 31
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
5. /* Una empresa comercial desea hacer un programa en Java para calcular el precio neto de un
artículo 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 */
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);
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 32
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
7. /* Una empresa comercial desea hacer su programa en Java, para calcular el precio neto de un
articulo de acuerdo a la siguiente tabla:
a) Si la venta es al contado se le da el 40% de descuento.
b) Si la venta es a plazos y tiempo<= a 12 meses se le debe de recargar el 30% del precio de venta
tiempo> a 12 meses se le debe de recargar el 60% del precio de venta.
Se debe de ingresar el precio del articulo, el codigo de venta, c si es al contado y p si es a plazos (Si
la venta es a plazos se debe de ingresar el tiempo de pago. */
package ejercicio006;
import java.io.*;
public class Ejemplo60
{
public static void main(String arg[]) throws IOException
{
BufferedReader br= new BufferedReader (new InputStreamReader(System.in));
String cod;
double pa,pn,t;
System.out.println("Ingrese Precio del Articulo:");
pa=Double.parseDouble(br.readLine());
System.out.println("Ingrese Codigo de Venta de Articulo:");
cod=(br.readLine());
if(cod.equals("c"))
{
pn=pa*0.6;
}
else
{
System.out.println("Ingrese el 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);
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 33
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
TEMAS: REPETITIVAS (MIENTRAS, REPETIR HASTA, DESDE O PARA)
1. // Se desea Leer las calificaciones de una clase de informatica, y calcular el numero de aprobados
package ejercicio007;
import java.io.*;
public class Ejemplo007
{
public static void main(String[] args) throws IOException
{
int nota,n,ca=0;
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
System.out.println("Ingrese la Cantidad de Notas:");
n=Integer.parseInt(br.readLine());
for(int i=0; i<n;i++)
{
System.out.println("Ingrese la Nota:");
nota=Integer.parseInt(br.readLine());
if(nota>11)
{
ca++;
}
}
System.out.println("La Cantidad de Notas Aprobatorias es:"+ca);
}
}
2.
/* Se desea Leer las calificaciones de una clase de informatica, y desarrollar lo siguiente:
 Calcular y Reportar el número de aprobados.
 Calcular y Reportar el número de desaprobados.
 Calcular y Reportar la nota mayor.
 Calcular y Reportar la nota menor.
 Calcular y Reportar el promedio general. */
package ejercicio007;
import java.io.*;
public class Ejemplo007
{
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 34
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
public static void main(String[] args) throws IOException
{
int calificaciones, cantidad, aprobados = 0, desaprobados = 0, i;
int menor=21, mayor = 0;
float sumanota=0, promedio;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("PROGRAMA DE CALIFICACIONES");
do {
System.out.println("Ingrese la Cantidad de Notas:");
cantidad = Integer.parseInt(br.readLine());
} while (cantidad < 1 || cantidad > 8);
for (i = 0; i < cantidad; i++)
{
do {
System.out.println("Ingrese Nota " + (i + 1) + ": ");
calificaciones = Integer.parseInt(br.readLine());
} while (calificaciones < 0 || calificaciones > 20);
sumanota=sumanota+calificaciones;
if (calificaciones > 10)
aprobados++;
else
desaprobados++;
if (calificaciones > mayor)
mayor = calificaciones;
if (calificaciones < menor)
menor = calificaciones;
}
}
promedio=sumanota/cantidad;
System.out.println("REPORTE DE RESULTADOS");
System.out.println("La Cantidad de Notas Aprobatorias es:" + aprobados);
System.out.println("La Cantidad de Notas Desaprobatorias es:" + desaprobados);
System.out.println("La Notas Mayor de las calificaciones es:" + mayor);
System.out.println("La Notas Menor de las calificaciones es:" + menor);
System.out.println("El Promedio General de Calificaciones es:" + promedio);
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 35
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
3.-
/* En un banco los intereses a pagar dependen del plazo al que se efectua el prestamo.
Si es a 24 meses, se paga el 12% de interes anual. Si es a 18 meses, se paga el 10% de interes
anual. Si es a 12 meses, se paga el 9% de interes anual. Si es a 6 meses, se paga el 8% de
interes anual. Si es a 3 meses, se paga el 6% de interes anual. Ingrese cuanto dinero y el plazo
al que se realiza el prestamo y determine el interes anual a pagar */
package ejercicio008;
import java.io.*;
public class Ejemplo008
{
public static void main(String[] args) throws IOException
{ int dinero,plazo=0;
float monto, interes=0;
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
do{ System.out.println("Ingrese la Cantidad de Dinero:");
dinero=Integer.parseInt(br.readLine());
} while(dinero<100 || dinero>10000);
do{ System.out.println ("TABLA DE PLAZOS DE PRESTAMOS");
System.out.println ("[1]. 24 Meses");
System.out.println ("[2]. 18 Meses");
System.out.println ("[3]. 12 Meses");
System.out.println ("[4]. 06 Meses");
System.out.println ("[5]. 03 Meses");
System.out.println ("Digite una de las Opciones [ ]");
plazo=Integer.parseInt(br.readLine());
} while(plazo<1 || plazo>5);
switch(plazo)
{
case 1: interes = (float) (dinero * 0.12)*2;
break; //monto= dinero+interes;
case 2: interes = (float) ((float) (dinero * 0.10) * 1.5);
break;
case 3: interes = (float) (dinero * 0.09);
break;
case 4: interes = (float) ((float) (dinero * 0.08) * 0.5);
break;
case 5: interes = (float) ((float) (dinero * 0.06) * 0.25);
break;
}
monto=dinero + interes;
System.out.println("La Cantidad de Dinero es:"+monto);
System.out.println("El Total de Interes a pagar es:"+interes);
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 36
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
4.-
/* Dado el peso, la altura y el sexo, de unos estudiantes. Determinar la cantidad de vitaminas que
deben consumir estos estudiantes, en base al siguiente criterio:
 Si son varones, y su estatura es mayor a 1.60 mts, y su peso es mayor o igual a 70 Kg, su
dosis, serán: 20% de la estatura y 80% de su peso. De lo contrario, la dosis será la siguiente:
30% de la estatura y 70% de su peso.
 Si son mujeres, y su estatura es mayor de a 1.50 m y su peso es mayor o igual a 60 Kg, su
dosis será: 25% de la estatura y 75% de su peso. De lo contrario, la dosis será: 35% de la
estatura y 65% de su peso. La dosis debe ser expresada en gramos. */
package practica01;
import java.io.*;
//Nombre del Proyecto
//Libreria
public class Vitaminas
//Nombre de la clase
{
public static void main(String[] args) throws IOException
//Cabecera del Programa
{
int can=0, sexo, i=0;
//Declaracion de variables
float peso, altura, dosis=0;
//String sexo;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//Declaracion de variable de memoria
System.out.println("PROGRAMA DE DOSIS DE VITAMINAS"); //Titulo; puede ser variado
do { //Inicio de lazo repetitivo
System.out.println("Ingrese Cantidad de Personas:"); //Mensaje que puede ser variado
can=Integer.parseInt(br.readLine()); //Lee mensaje y se almacena en la variable “can”
} while (can <0 || can>10);
// Finalizacion de lazo repetitivo. Donde cantidad de personas esta en el rango de 0 a 10
while(i<can) //Inicio del lazo repetitivo mientras. Donde "i" es el contador de alumnos
{
do{
//Lazo repetito "Repetir Hasta que"
System.out.println("Ingrese Sexo (0) Femenino (1) Masculino :");
sexo = Integer.parseInt(br.readLine());
} while (sexo != 0 && sexo != 1);
//Condicion de salida de lazo repetitivo de la variable sexo
do{
System.out.println("Ingrese la Estatura:");
altura = Float.parseFloat(br.readLine());
} while(altura<1.00 || altura>2.00);
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 37
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
do{
System.out.println("Ingrese el Peso en Libras:");
peso = Float.parseFloat(br.readLine());
} while(peso<10 || peso>300);
if (sexo == 0) //inicio de lazo simple
{
if (altura >= 1.50 && peso >= 130) //Inicio de lazo doble
{
dosis = (float) (0.25 * altura + 0.75 * peso);
//conversion para datos reales, float
}
else
//Condicion doble
{
dosis = (float) (0.35 * altura + 0.65 * peso);
}
}
//Finzalizacion del lazo simple
else
{
if (altura >= 1.60 && peso >= 150)
{
dosis = (float) (0.20 * altura + 0.80 * peso);
}
else
{
dosis = (float) (0.30 * altura + 0.70 * peso);
}
}
i++;
//Reporte de Resultados
System.out.println("La Cantidad de Dosis a recibir es de :" + dosis);
}
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 38
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
El siguiente trabajo debe de ser desarrollado utilizando libros, manuales, y otros en la biblioteca o en Internet.
La parte teórica lo desarrollaran en Word o Adobe, la parte práctica lo desarrollaran en Java NetBeans 7.3.
Tien que tener cuenta de la Plataforma Virtual de la Facultad de Ingeniería www.ingenieria.uspvirtual.com
En esta plataforma deben de registrar todas sus tareas que se iran programando, así mismo tiene que tener
en cuenta que para ingresar a la Plataforma de la Facultad de Ingeniería, debe de seguir los siguientes pasos:
1.-
Ingresar a la siguiente dirección electrónica www.ingenieria.uspvirtual.com
2.-
Si no tiene usuario debe registrarse (Parecido a como crearse una cuenta en Hotmail o en Facebook).
3.-
Luego debe de ingresar son su usuario y contraseña con el cual se han registrado.
4.-
Ingresar al curso de Fundamentos de Programación, correspondiente al segundo ciclo de estudios
LABORATORIO Nº 01
TEMAS: PROGRAMACIÓN SECUENCIAL
TEORÍA: Desarrolle en su cuaderno de trabajo las siguientes preguntas.
1.
Que entiende por contador, detalle 3 ejemplos
2.
Explique que es asignación, detalle 3 ejemplos
3.
Que entiende por acumulador, detalle 3 ejemplos
4.
Que entiende por algoritmo, explique con un ejemplo
5.
Que entiende por programa.
6.
Para que se utilizan las Librerías del JAVA – NETBEANS.
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, detalle 3 ejemplos
10.
Los contadores y los acumuladores son iguales, explique y justifique su respuesta
11.
Que entiende por Programación Estructurada (Buscar en Internet)
12.
Que entiende por Programación Orientada a Objetos (Buscar en Internet)
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 39
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 Triángulo. 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 cuadrado
12.
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 2013
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 40
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
LABORATORIO N° 02
TEMAS: SECUENCIALES — SELECTIVAS (SIMPLE, DOBLE, MÚLTIPLE)
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
2.-
RANGO DE EDAD
Niñez
00 - 10
Adolescencia
11- 18
Juventud
19 - 34
Madurez
35 - 64
Ancianidad
65 — 100
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 el Monto del dinero y el plazo al que se realiza el préstamo; luego determine el interés anual a
pagarse, reporte todos los resultados.
3.-
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 (Es decir hasta 2 ejes). Debe de realizar un pago de 7.50 por
cada eje.
4.-

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 cuena con más de 7 ejes. Debe de realizar un pago de 2.00 por cada eje.
El Docente del curso de Programación, selecciona tres notas finales de su curso. Para lo cual desea
averiguar lo siguiente:

La nota mayor

La nota menor

La nota intermedia
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 41
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
5.-
Realizar un programa que calcule el importe a pagar por un vehículo al circular por una autopista. El
vehículo pude ser una bicicleta, una moto, un carro o un camión. El importe se calculara según los
siguientes datos:
a) Un importe de 1 sol por Km. para la bicicleta.
b) Las motos y los carros pagaran 3 soles por Km.
c) Los camiones pagaran 3 soles por Km. más 2.5 soles por toneladas.
6.-
En una empresa pesquera, los funcionarios de esta, han considerado para sus trabajadores un sueldo
básico de 500 soles. Además están considerando las siguientes bonificaciones según su tiempo de
servicios en la empresa:
Tiempos de Servicios
Bonificación en Soles
Entre 1 y 5 años
200
Entre 6 y10 años
400
Entre l0 y 15 años
800
Mayores a 15 años
1000
Se debe de ingresar código de trabajador, nombres y tiempo de servicios. El sueldo bruto es igual a:
Sueldo básico más la bonificación
Calcular y reportar el sueldo bruto de un trabajador
7.
Diseñe una pequeña calculadora que, al digitar un código realice una operación específica: si el código
es 1, la operación es la suma, si es 2, Resta. 3, multiplicación y 4 división. Si el usuario a escrito otro
código inválido, mostrar un mensaje de error.
8.
Se desea calcular el sueldo de un trabajador, a partir de las horas trabajadas en la semana y la clase a
la que pertenece: Trabajadores Clase “A”, se les paga $7 por hora. Trabajadores clase “B”, se paga $5
por hora. Trabajadores clase “C”, se les paga $4 por hora y los de clase “D”, $3.5 por hora.
9.
Un comerciante se dedica a la venta de sillas únicamente. Vende tres tipos de sillas: tipo A, tipo B y
Tipo C los precios son $5.00, $7.00 y $10.00 respectivamente. Por cada cinco sillas compradas del tipo
A, del tipo B o del tipo C los clientes reciben un descuento de 3%, 5% y 7%, las demás se cobran a
precio normal. Diseñe un programa que imprima en forma de factura, con el nombre, precio unitario,
precio total, nombre de la tienda, etc. lo que debe cancelar cada cliente en concepto de la compra.
10.. Programa para calcular el precio a pagar por la compra de madera. Los datos de entrada son la
cantidad de metros cúbicos y el tipo de madera. La madera está clasificada en tres tipos (A, B, C). Si la
cantidad a comprar es superior a 30 metros cúbicos, se aplica el siguiente esquema de descuento:
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 42
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Tipo de Madera
Descuento
A
4%
B
8%
C
10%
10. Desarrolle un programa que almacene los datos de 02 vendedores, y por ambos calcular la
comisión que le corresponde de acuerdo a las ventas que hizo. Los criterios son:
Ventas (Soles)
Comisión (% sobre la venta)
Menor a 500
0.5
Mayor o igual a 500 y Menor que 1000
1
Mayor o igual a 1000 y menor que 1500
2
Mayor o igual a 1500
2.5
Chimbote, Abril del 2013
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 43
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
CAPÍTULO IV: CLASES, CONSTRUCTORES Y MÉTODOS
9.
CLASES
En esta parte se estudiaran los puntos que se indican en la parte inferior
9.1
INTRODUCCIÓN
Cuando 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, etc
Una clase es por tanto una plantilla implementada en software que describe un conjunto de
objetos con atributos y comportamiento similares.
Una instancia u objeto de una clase es una representación concreta y específica de una clase y
que reside en la memoria del ordenador.
9.2
ATRIBUTOS
Son 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.
9.3
COMPORTAMIENTO
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 44
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
9.4
LA CLASE
Para 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
}
9.5
LOS MIEMBROS DATO
Los valores de los atributos se guardan en los miembros dato o variables de instancia. Los
nombres de dichas variables comienzan por letra 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, y;
int ancho, alto;
//faltan las funciones miembro
}
9.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
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 45
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
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ón
void 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;
//...
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 46
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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;
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 47
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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+ancho
Tambié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;
}
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.
10.
LOS CONTRUCTORES
Un 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, ancho, alto;
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 48
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
{
int, y, ancho, alto;
Rectangulo()
{
x=0;
y=0;
ancho=0;
alto=0;
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 49
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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, 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);
}
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;
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 50
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
10.1 LOS OBJETOS
Para crear un objeto de una clase se usa la palabra reservada new.
Por ejemplo,
Rectangulo rect1=new Rectangulo(10, 20, 40, 80);
new reserva espacio en memoria para los miembros dato y devuelve una referencia que se
guarda en la variable rect1 del tipo 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.
10.2 ACCESO A LOS MIEMBROS
Desde un objeto se puede acceder a los miembros mediante la siguiente sintaxis
objeto.miembro.
Por ejemplo, podemos acceder al miembro dato ancho, para cambiar la anchura de un objeto
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.
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);
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 51
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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");
}
System.out.println("El punto está fuera del rectángulo");
}
else
{
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"); }
}
}
10.3 LA VIDA DE UN OBJETO
En el lenguaje C++, los objetos que se crean con new se han de eliminar con delete. new
reserva espacio en memoria para el objeto y delete libera dicha memoria. En el lenguaje Java no
es necesario liberar la memoria reservada, el recolector de basura (garbage collector) se
encarga de hacerlo por nosotros, liberando al programador de una de las tareas que más
quebraderos de cabeza le producen, olvidarse de liberar la memoria reservada.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 52
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Veamos un ejemplo
public class UnaClase
{
public static void main(String[] args)
{
Image granImagen=creaImagen();
mostrar(graImagen);
while(condicion)
{ calcular();
}
}
}
El objeto granImagen, continua en memoria hasta que se alcanza el final de la 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(); }
}
}
10.4 IDENTIFICADORES
Có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
mantener
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 53
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
public 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;
}
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.
11.
METODOS
11.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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 54
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
{
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)
{
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 55
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
}
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 56
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 ’);
}
}
11.1 MÉTODOS DE LA CLASE MATH
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 57
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Método
abs( x )
Descripción
Valor absoluto de x.
Ejemplo
Si x>0; abs( x ) es x
Este método también tiene versiones para valores float, Si x=0; abs( x ) es 0
ceil( x )
int y long.
Si x<0; abs( x ) es 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
max(2.3,12.7) es 12.7
Este método también tiene versiones para valores float, max(-2.3,-12.7) es -2.3
int y long.
min( x, y )
Valor menor de x e y
min(2.3,12.7) es 2.3
Este método también tiene versiones para valores float, min(-2.3,-12.7) es -12.7
int y long.
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º 58
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 aleatorios
El 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º 59
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
12.
DESARROLLO DE PROGRAMAS EJEMPLOS
TEMAS: 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)
{
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');
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 60
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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; }
}
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');
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 61
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
TEMAS: CLASES Y OBJETOS, 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: ");
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());
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 62
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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++; }
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++;
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 63
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 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());
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 64
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
package calificaciones;
public class PROCESOS
{
double cap=0;
void apro(int cal)
{
if(cal>10 && cal<20) cap++;
}
double reporapro()
{
return cap;
}
}
3.-
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());
System.out.println("REPORTE DE RESULTADOS");
System.out.println("El MCD es:"+p.p_mcd());
System.out.println("El MCM es:"+p.p_mcm());
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 65
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
package Multiplo;
public class Proceso
{ int a,b,pro;
//Datos miembros globales
public Proceso()
{
//Constructor
a=0, b=0;
}
public Proceso(int xa, int xb)
{
a=xa, b=xb;
//inicializaciones
//Sobrecarga de constructor
}
public void ingreso(int ya, int yb)
//Asignacion de datos de ingreso
{
//Metodo de ingreso
a=ya, b=yb;
}
public int listanumero1()
{
return a;
}
public int listanumero2()
{
return b;
}
public double p_mcd()
{
pro=a*b;
while(a!=b)
{
if(a>b)
a=a-b;
else
b=b-a;
}
return a;
}
public double p_mcm()
{
int mcm;
mcm=pro/a;
return mcm;
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 66
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
LABORATORIO N° 03
TEMAS: REPETITIVAS (DESDE, MIENTRAS, REPETIR HASTA QUE) for, while, do while
1.
Elaborar una aplicación para calcular la siguiente serie: (Deberá de ingresar los valores de x y n).
x
S=
x2
+
3
2.
+
x3
xn
+ ..............+
5 7
2n+1
Elaborar una aplicación que permita determinar y listar los números de tres cifras que sean capicúas y
números perfectos.
Explicación: Números Capicúas: Son aquellos números enteros, que sus extremos son iguales
Ejemplo:
aba
121
cdc
252
Números Perfectos: Son aquellos números enteros, que al dividirse el número y tienen divisores
exactos, es decir resto 0, se suman estos divisores. Al finalizar las divisiones sucesivas; se deben de
igualar la suma de divisores con el número inicial. Si son iguales el Número es considerado como
perfecto.
Ejemplo:
Número Inicial
6
Divisores de 6
1, 2, 3, 4, 5
6/1
Su resto es igual a 0
Entonces SI sumamos el divisor
1
6/2
Su resto es igual a 0
Entonces SI sumamos el divisor
2
6/3
Su resto no es igual a 0
Entonces SI sumamos el divisor
3
6/4
Su resto es igual a 0
Entonces NO sumamos el divisor
0
6/5
Su resto es igual a 0
Entonces NO sumamos el divisor
0
Verificamos número 6 con la suma de divisores exactos (1+2+3). Por lo tanto el número 6 es Perfecto
3.
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).
Ejemplo:
4.
Tiempo Inicial de Entrada
Hora: 10
Minutos: 10
Segundos: 10
Tiempo Final de Salida
Hora: 10
Minutos: 10
Segundos: 11
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 67
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
5.
-
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.
Desarrolle un programa que permita calcular y reportar todos los números primos de solo 2 cifras.
Explicación:
Números Primos: Son aquellos que solo tienen 2 divisores exactos; el número 1 y el mismo número
6.
Dada una lista de 20 números enteros positivos (Todos los números son de dos dígitos). Calcular y
reportar lo siguiente:
 El número mayor.
 El número menor.
 Promedio general de números.
 Cuantos números son mayores al promedio general.
 Cuantos números son menores al promedio general.
7.
En la Universidad San Pedro, en la Facultad de Ingeniería, en la Escuela Profesional de Ingeniería
Informática y Sistemas, se van a publicar las notas del segundo ciclo de estudios. Si se sabe que en el
segundo ciclo registran matricula 35 alumnos y llevan los cursos de: Matemáticas, Ingles, Fundamentos
de Programación, Física I y Teoría de Sistemas. De cada alumno se tiene los siguientes datos;
Nombres, Apellidos y Promedio Final del curso. Se pide que calcule y reporte lo siguiente:
 Las 2 peores notas de todos los cursos.
 Las 2 mejores notas de todos los cursos.
 Promedio general de notas de todos los cursos
 Cuantas notas son aprobatorias en Matemáticas
 Cuantas notas son desaprobatorias en Programación.
8.
A una fiesta asistieron personas de diferentes edades y sexos. Construir un programa dadas las
edades y sexos de las personas. Calcular y reportar:
 Cuantas personas asistieron a la fiesta.
 Cuantos hombres y cuantas mujeres.
 Promedio de edades por sexo.
 La edad de la persona más joven que asistió.
 Cuantos menores de edad asistieron a la fiesta.
 Ingresar datos hasta que se ingrese una edad a cero
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 68
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
9.
Desarrolle un programa que permita ingresar solo números enteros de 2 dígitos, luego debe de
calcular y reportar lo siguiente:
 Cuantos números son múltiplos de 11.
 Cuantos son múltiplos de 5 y 7 a la vez
 Cuantos números pares existen.
 Cuantos números impares existen
10.
Se desea desarrollar un programa que permita registrar N números enteros, luego debe de calcular y
reportar las siguientes tareas:
 Sumar todos los números que sean múltiplos de 3.
 Mostrar las 5 primeras potencias de 3 y la sumatoria de ellas.
 Calcular las 5 primeras parejas de números primos gemelos (Dos números son primos gemelos si
además de ser números primos, la diferencia entre ellos es exactamente dos).
11.
Hacer un programa que lea 50 consumos del día de un restaurante de la ciudad; que realiza ofertas
según la siguiente tabla:
 Si el consumo ingresado es menor a los 50 soles no existe descuento.
 Si el consumo ingresado está entre 50 y 70 soles, el descuento será de 5%.
 Si el consumo ingresado está entre 71 y 100 soles, el descuento será de 7%.
 Si el consumo ingresado está entre 101 y 500 soles, el descuento será de 10%.
 Si el consumo ingresado es mayor a 500 soles, el descuento será de 15%.
Además se sabe que por todo consumo se debe de pagar adicionalmente el 19% de IGV. También
debe de ingresar el número de mesa donde se consume
Calcular y reportar los siguientes:
 Cuál fue el menor consumo que hubo en el día
 Cuál fue el mayor consumo que hubo en el día
 Cuantos consumos hubo que fueron mayores a 500 soles.
 Cuantos consumos no tuvieron descuentos..
12.
Una tienda se dedica a la venta de computadoras, cuenta con 10 vendedores. Cada uno de ellos tiene
un sueldo mensual fijo de 800 soles, pero además de su sueldo ganan una comisión por venta
 Si el monto de venta es mayor de 10000 la comisión será del 15%.
 Si el monto de venta es mayor o iguales a 5000 y menor de 1000 la comisión es del 10%
 Si el monto de venta es mayor o iguales a 1000 y menor de 5000 la comisión es del 5%
 Si el monto de la venta es menor que 1000 no tiene comisión
Calcular y reportar lo siguiente:
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 69
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
 Cuantos vendedores realizaron ventas mayores a 10000 soles.
 Cuál es la sumatoria de las comisiones de los vendedores que ganaron comisiones del 5%
 Cuál es el promedio de ventas diarias.
 Cuantos vendedores realizaron ventas menores a 1000 soles.
Chimbote, Mayo del 2013
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 70
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
LABORATORIO N° 04
TEMAS: 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.
Chimbote, Mayo del 2013
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 71
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
LABORATORIO N° 05
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:
3.-
-
Promedio general de notas.
-
Reporte de cuantas notas por cada categoría se obtuvo.
-
Nota mayor de toda la clase.
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º 72
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 73
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Agronomía
70
Arquitectura
60
De acuerdo al puntaje obtenido por un alumno, determine la carrera a la que ingreso o de un mensaje
indicado que no le alcanzo el puntaje para ingresar.
Determine el proceso de 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*
1
2
3
4
**
**
**
**
1
2
3
4
......
15
**
......
15
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 74
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
2*
2
4
6
8
......
30
3*
3
6
9
12
......
45
4*
4
8
12
16
......
60
15
30
45
60
......
225
..
..
..
15*
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, Junio del 2013
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 75
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
13.- COMPONENTES SWING
13.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.
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.
13.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.*;
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 76
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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 );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 77
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 78
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.*;
import com.sun.java.swing.*;
import com.sun.java.swing.border.*;
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 79
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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º 80
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
}
}
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 );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 81
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 );
}
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 82
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.*;
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() {
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 83
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.

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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 84
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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",
};
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 ) );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 85
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 argumento
Constructor ctor = bClass.getConstructor( new Class[] {
String.class
} );
// Se crea un nuevo objeto del tipo del botón
botonAbs = ( AbstractButton )ctor.newInstance( new Object[]{
ids[i]
} );
} catch( Exception e ) {
System.out.println( "No puedo crear " + bClass );
}
botones.add( botonAbs );
panel.add( botonAbs );
}
return( panel );
}
public java1406() {
add( creaPanelBotones( JButton.class,ids ) );
add( creaPanelBotones( JToggleButton.class,ids ) );
add( creaPanelBotones( JCheckBox.class,ids ) );
add( creaPanelBotones( JRadioButton.class,ids ) );
}
public static void main( String args[] ) {
JFrame frame = new JFrame( "Tutorial de Java, Swing" );
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
});
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 86
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 87
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
add( new JScrollPane( lista ) );
JComboBox combo = new JComboBox();
for( int i=0; i < 100; i++ )
combo.addItem( Integer.toString( i ) );
add( combo );
}
public static void main( String args[] ) {
java1407 lista = new java1407();
JFrame ventana = new JFrame();
ventana.getContentPane().add( lista,BorderLayout.CENTER );
ventana.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
} );
ventana.setSize( 200,200 );
ventana.setTitle( "Tutorial de Java, Swing" );
ventana.setVisible( true );
}
}
La imagen siguiente es el resultado que se obtiene en pantalla tras la 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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 88
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
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 );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 89
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 90
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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;
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" );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 91
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 ) );
}
private StyleContext creaEstilos() {
StyleContext sc = new StyleContext();
estiloRojo = sc.addStyle( null,null );
StyleConstants.setForeground( estiloRojo,Color.red );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 92
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
indicar un texto de información virtualmente en cualquier lugar y lo único que se necesita es
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 93
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 94
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
import java.awt.*;
import java.awt.event.*;
import com.sun.java.swing.*;
public class java1410 extends JPanel {
static Icon imgs[] = {
new ImageIcon( "star0.gif" ),
new ImageIcon( "star1.gif" ),
new ImageIcon( "star2.gif" ),
new ImageIcon( "star3.gif" ),
new ImageIcon( "star4.gif" ),
};
JButton boton = new JButton( "JButton",imgs[3] );
JButton boton2 = new JButton( "Deshabilita" );
boolean mad = false;
public java1410() {
boton.addActionListener( new ActionListener() {
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!" );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 95
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
add( boton );
boton2.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent evt ){
if( boton.isEnabled() ) {
boton.setEnabled( false );
boton2.setText( "Habilita" );
}
else {
boton.setEnabled( true );
boton2.setText( "Deshabilita" );
}
}
} );
add( boton2 );
}
public static void main( String args[] ) {
java1410 boton = new java1410();
JFrame ventana = new JFrame();
ventana.getContentPane().add( boton,BorderLayout.CENTER );
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 );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 96
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.*;
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 97
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 },
};
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 },
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 98
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
{ "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,
};
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 99
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
static public JMenuBar creaMenuBarra( Object barraMenuDato[] ) {
JMenuBar barraMenu = new JMenuBar();
for( int i=0; i < barraMenuDato.length; i++ )
barraMenu.add( creaMenu((Object[][])barraMenuDato[i]) );
return( barraMenu );
}
static public JMenu creaMenu( Object[][] menuDato ) {
JMenu menu = new JMenu();
menu.setText( (String)menuDato[0][0] );
menu.setMnemonic( ((Character)menuDato[0][1]).charValue() );
grupoBotones = new ButtonGroup();
for( int i=1; i < menuDato.length; i++ ) {
if( menuDato[i][0] == null )
menu.add( new JSeparator() );
else
menu.add( creaMenuItem( menuDato[i] ) );
}
return( menu );
}
static public JMenuItem creaMenuItem( Object[] dato )
{
JMenuItem m = null;
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] );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 100
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
m.setMnemonic( ((Character)dato[2]).charValue() );
m.addActionListener( (ActionListener)dato[3] );
m.setEnabled( ((Boolean)dato[4]).booleanValue() );
// Y ahora el caso opcional de los iconos
if( dato.length == 6 )
m.setIcon( (Icon)dato[5] );
return( m );
}
java1411()
{
setLayout( new BorderLayout() );
add( creaMenuBarra( barraMenu ),BorderLayout.NORTH );
JPanel p = new JPanel();
p.setLayout( new BorderLayout() );
p.add( txt,BorderLayout.NORTH );
p.add( lbl,BorderLayout.CENTER );
add( p,BorderLayout.CENTER );
}
public static void main(String args[])
{
java1411 panel = new java1411();
JFrame ventana = new JFrame();
ventana.getContentPane().add( panel,BorderLayout.CENTER );
ventana.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent evt )
{
System.exit( 0 );
}
}
);
ventana.setSize( 300,200 );
ventana.setTitle( "Tutorial de Java, Swing" );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 101
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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,
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 102
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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:
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 );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 103
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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" );
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º 104
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
}
});
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 {
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 105
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
JProgressBar barraProg = new JProgressBar();
JSlider barraSlid = new JSlider( JSlider.HORIZONTAL,0,100,60 );
public java1413() {
setLayout( new GridLayout(2,1) );
add( barraProg );
barraSlid.setValue( 0 );
barraSlid.setPaintTicks( true );
barraSlid.setMajorTickSpacing( 20 );
barraSlid.setMinorTickSpacing( 5 );
barraSlid.setBorder( new TitledBorder("Desplazame") );
barraSlid.addChangeListener( new ChangeListener() {
public void stateChanged( ChangeEvent evt ) {
barraProg.setValue(barraSlid.getValue() );
}
} );
add( barraSlid );
}
public static void main( String args[] ) {
JFrame frame = new JFrame( "Tutorial de Java, Swing" );
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
} );
frame.getContentPane().add( 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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 106
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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..." ) );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 107
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
JPanel panelBotones = new JPanel();
JButton botonArranque = new JButton( "Arrancar" );
botonArranque.setBackground( SystemColor.control );
panelBotones.add( botonArranque );
botonArranque.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent evt ) {
iniciaCuenta();
}
} );
JButton botonParar = new JButton( "Parar" );
botonParar.setBackground( SystemColor.control );
panelBotones.add( botonParar );
botonParar.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent evt ) {
detieneCuenta();
}
} );
panelInferior.add( panelBotones );
add( panelInferior,BorderLayout.SOUTH );
}
public void iniciaCuenta() {
if( hilo == null ) {
hilo = new ThreadCarga();
pideParar = false;
hilo.start();
}
}
public void detieneCuenta() {
synchronized( objeto ) {
pideParar = true;
objeto.notify();
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 108
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
class ThreadCarga extends Thread
{
public void run()
{
int min = 0;
int max = 100;
barra.setValue( min );
barra.setMinimum( min );
barra.setMaximum( max );
for (int i=min; i <= max; i++ )
{
barra.setValue( i );
texto.setText( ""+i );
synchronized( objeto ) {
if( pideParar )
break;
try {
objeto.wait( 100 );
} catch( InterruptedException e ) {
// Se ignoran las excepciones
}
}
}
hilo = null;
}
}
public static void main( String args[] ) {
JFrame frame = new JFrame( "Tutorial de Java, Swing" );
frame.addWindowListener( new WindowAdapter() {
public void windowClosing( WindowEvent evt ) {
System.exit( 0 );
}
});
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 109
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 test
class Rama {
DefaultMutableTreeNode r;
public Rama( String datos[] ) {
r = new DefaultMutableTreeNode( datos[0] );
for( int i=1; i < datos.length; i++ )
r.add( new DefaultMutableTreeNode( datos[i] ) );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 110
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
}
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 ) {
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 111
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
rama = new Rama( datos[i++] ).node();
// Control de la útlima selección realizada
seleccion = (DefaultMutableTreeNode)
arbol.getLastSelectedPathComponent();
if( seleccion == null )
seleccion = raiz;
// El modelo creará el evento adecuado, y en respuesta a él, el árbol se actualizará
// 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 );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 112
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 113
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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" );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 114
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
imgCartas[4] = new ImageIcon( "_cinco.gif" );
imgCartas[5] = new ImageIcon( "_seis.gif" );
imgCartas[6] = new ImageIcon( "_siete.gif" );
imgCartas[7] = new ImageIcon( "_diez.gif" );
imgCartas[8] = new ImageIcon( "_once.gif" );
imgCartas[9] = new ImageIcon( "_doce.gif" );
}
public Component getTreeCellRendererComponent( JTree arbol,
Object valor,boolean seleccionado,boolean expandido,
boolean rama,int fila,boolean conFoco ) {
// Hay que encontrar el nodo en que estamos y coger el texto que contiene
DefaultMutableTreeNode nodo = (DefaultMutableTreeNode)valor;
String texto = (String)nodo.getUserObject();
this.seleccionado = seleccionado;
// Se fija el color de fondo en 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" ) )
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 115
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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);
}
// 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 );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 116
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 117
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 ella
class ModeloDatos extends AbstractTableModel {
Object datos[][] = {
{"uno","dos","tres","cuatro"},
{"cinco","seis","siete","ocho"},
{"nueve","diez","once","doce"},
};
// Esta clase imprime los datos en la consola cada vez que se produce un cambio en cualquiera
// De las casillas de la tabla
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 118
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 119
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
// 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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 120
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.*;
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 121
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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++ ) {
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 );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 122
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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:
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[][] = {
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 123
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
{ "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],
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" );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 124
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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º 125
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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º 126
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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";
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 127
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
else
respuesta = "No";
System.out.println( "Respuesta: "+respuesta );
}
public static void main( String args[] ) {
new java1420().setVisible( true );
}
}
Si se ejecuta el programa anterior, la imagen que aparece en la pantalla corresponde a la
ventana de 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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 128
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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 );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 129
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
JRootPane rootPane = getRootPane();
rootPane.registerKeyboardAction( this,"arriba",arriba,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
rootPane.registerKeyboardAction( this,"abajo",abajo,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
rootPane.registerKeyboardAction( this,"drcha",drcha,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
rootPane.registerKeyboardAction( this,"izqda",izqda,
JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT );
for( int i=0; i < 9; i++ ) {
JButton boton;
boton = new JButton();
boton.setBorder( borde );
boton.setName( new Integer(i).toString() );
pane.add( boton );
botones[i] = boton;
}
setSize( 200,200 );
}
public void actionPerformed( ActionEvent evt ) {
Component foco = getFocusOwner();
String nombre = foco.getName();
int indice = Integer.parseInt( nombre );
botones[indice].setText( "" );
String accion = evt.getActionCommand();
if( accion.equals( "arriba" ) ) {
indice = (indice < 3) ? indice + 6 : indice - 3;
} else if( accion.equals( "abajo" ) ) {
indice = (indice > 5) ? indice - 6 : indice + 3;
} else if( accion.equals( "izqda" ) ) {
indice = (indice == 0) ? indice = 8 : indice - 1;
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 130
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
} 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.
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.*;
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 131
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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;
if( dim1.width > dim2.width ) {
escalaX = (float)dim1.width / (float)dim2.width;
escalaY = (float)dim1.height / (float)dim2.height;
// Escalamos en función del movimiento
point.x /= escalaX;
point.y /= escalaY;
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 132
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
else {
escalaX = (float)dim2.width / (float)dim1.width;
escalaY = (float)dim2.height / (float)dim1.height;
// Escalamos en función del movimiento
point.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
panelScro2 = new JScrollPane();
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 133
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 134
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
Cuando se ejecuta el programa y se agranda la ventana, se puede ver una imagen semejante a
la que reproduce la imagen siguiente.
Ahora, los movimientos sobre la barra de desplazamiento vertical en el panel superior hacen que
la imagen que esta en el panel inferior se desplace al mismo tiempo. Quiza esto no le parezca al
lector demasiado 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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 135
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 Lookand-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.
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.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 136
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
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º 137
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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º 138
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
Java incorpora su propio Look&Feel por defecto, cuyo nombre es Metal, y que se muestra a
continuación.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 139
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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.
Y el ejemplo que aparece a continuación, representa la apariencia que ofrecía el Look&Feel
Organic Vancouver.
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 140
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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º 141
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 142
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 {
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 143
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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" );
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
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 144
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 );
}
public boolean isSupportedLookAndFeel() {
return( true );
}
protected void initClassDefaults( UIDefaults tabla ) {
super.initClassDefaults( tabla );
table.put( "ButtonUI","flecha.FlechaButtonUI" );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 145
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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º 146
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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(),
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 147
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
ab.getVerticalTextPosition(),
ab.getHorizontalTextPosition(),
rectBoton,rectIcono,rectTexto,sepTxtIcono );
if( bm.isArmed() && bm.isPressed() ) {
offsetDesplaz = 1;
}
// 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 {
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 148
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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(),
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 );
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 149
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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;
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 );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 150
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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;
}
public void mouseMoved( MouseEvent evt ) {
}
public void mouseClicked( MouseEvent evt ) {
}
public void mouseDragged( MouseEvent evt ) {
ButtonModel bm = ab.getModel();
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 151
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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º 152
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)

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º 153
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 indican
public 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;
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 154
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
private JCheckBoxMenuItem opcionF2C;
private JCheckBoxMenuItem opcionC2F;
private JMenu menuLaf;
private ButtonGroup grupoLaf;
private JRadioButtonMenuItem opcionLaf;
private UIManager.LookAndFeelInfo laf[];
// Este es el contrsuctor de la clase, que crea la barra del menú superior, las barras de
// Desplazamiento que van a ir mostrando las conversiones de temperatura y registra los
// Receptores de eventos
public java1427() {
super( "Tutorial de Java, Swing" );
// Los dos paneles correspondientes a cada sistema de grados
JPanel panelFH;
JPanel panelCG;
barraMenu = new JMenuBar();
menuModo = new JMenu( "Modo" );
menuLaf = new JMenu( "LookAndFeel" );
grupoLaf = new ButtonGroup();
// Se crean las opciones correspondientes a los modos de 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++ ) {
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 155
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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
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 );
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 156
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
// 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 );
// 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 );
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 157
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
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 );
}
else {
super.processEvent( evt );
}
}
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 158
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
/* 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(
Ingeniería Informática y de Sistemas – Facultad de Ingeniería- Universidad San Pedro – Chimbote
Página Nº 159
Autor: Ing. Javier Martínez Carrión (Mg. Dr.)
"com.sun.java.swing.plaf.motif.MotifLookAndFeel" );
SwingUtilities.updateComponentTreeUI(
SwingUtilities.getRoot( MiFrame ) );
} else if( rb.isSelected() && rb.getText().equals("Metal") ) {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.metal.MetalLookAndFeel" );
SwingUtilities.updateComponentTreeUI(
SwingUtilities.getRoot( MiFrame ) );
}
} catch( UnsupportedLookAndFeelException e ) {
// Si no está soportado el Look&Feel que se acaba de seleccionar, se presenta un mensaje al
// Uso, se deshabilita el 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º 160
Descargar