Beruflich Dokumente
Kultur Dokumente
Objetivo
Desarrollar una aplicacin que dibuje figuras en 2D tales como: lneas,
rectngulos, crculos, arcos y su uso para dibujar grficos de barras, lneas y de
pastel.
Objetivos especficos:
Introduccin
Desde hace algunos aos se ha venido incrementando exponencialmente el
nmero de aplicaciones de juegos y video juegos disponibles en las tiendas de
venta de software. Este tipo de aplicaciones no son exclusivas de nios y jvenes,
sino que muchsima gente adulta se ha vuelto consumidor y usuario de ellas. El
hecho de poder accederlas desde prcticamente cualquier dispositivo electrnico
porttil o no, les ha permitido irse infiltrando en nuestras actividades diarias que
prcticamente no hay da en que los usuarios no accedan a este tipo de
aplicaciones y adems lo consideran ya como normal.
Ahora bien, estas aplicaciones muy avanzadas y modernas tuvieron como punto
de origen juegos como el tenis electrnico, en el que dos barras hacan las veces
de raquetas y un crculo el de una pelotita rebotando en la pantalla. Estos son
justamente los elementos que se aprender a graficar y a darles un uso distinto en
la generacin de diferentes tipos de grficos.
Para aquellos que se interesen en desarrollar juegos electrnicos o bien video
juegos, existen muchas aplicaciones que facilitan su creacin. Sin embargo, para
alguien que est en el mundo del desarrollo de aplicaciones computacionales
debe contar al menos con los elementos bsicos del mundo de las grficas para
que, si as lo desea, poder entender los procesos que estn detrs de cualquier
facilidad proporcionada por el software elegido.
Prctica 5 - 1
Ahora bien, se reconoce que una tabla llena de datos no permite fcilmente
encontrar tendencias o patrones presentes en dichos datos, mientras que si stos
se presentan de manera grfica, la mente es capaz de extraer informacin
importante de ellos. Es entonces que la prctica aqu desarrollada, permitir
presentar una serie de datos que inicialmente estn en una tabla, en forma grfica,
ya sea de lneas, de barras o de pastel. Lo anterior con el conocimiento del dibujo
de lneas, rectngulos, crculos y arcos.
Computadora o laptop
Software: NetBeans 7.2 en adelante
Metodologa
Para el desarrollo de esta prctica se ha considerado conveniente presentar
primero cmo dibujar los elementos bsicos de un grfico, como son el dibujado
de lneas, rectngulos, crculos y arcos. Una vez conocida esta informacin se
pasar a la segunda seccin, donde se llevar a cabo la construccin de los tres
tipos de grficos escogidos, con apoyo de lo visto en la primera seccin.
Prctica 5 - 2
instrucciones que ponen las bases para comprender de mejor manera, cmo se
dibujan los grficos ya mencionados.
Esta prctica consiste en un JFrame que contiene un JPanel modificado por
nosotros, haciendo que herede de su clase original y sobrescribindole el mtodo
paintComponent(). Este panel ser el rea usada para dibujar. En l se dibujarn
primeramente 10 lneas cuyas posiciones sern generadas aleatoriamente.
Posteriormente se dibujarn otras figuras en lugar de las lneas, pero
aprovechando las instrucciones existentes.
Paso 1. Crear un nuevo proyecto con nombre Practica5_DibujoLRCA, cuidando
desmarcar la casilla de verificacin (checkBox) del Create Main Class (ya no se
dan detalles porque se asume que estos pasos ya no requieren de explicacin).
Paso 2. Aadir un JFrame Form al proyecto con nombre PaintDemo.
Se genera el cdigo siguiente:
public
class
PaintDemo
extends
javax.swing.JFrame
{
public
PaintDemo()
{
initComponents();
}
public
static
void
main(String
args[])
{
java.awt.EventQueue.invokeLater(new
Runnable()
{
public
void
run()
{
new
PaintDemo().setVisible(true);
}
});
}
//
Variables
declaration
-
do
not
modify
//
End
of
variables
declaration
}
Prctica 5 - 3
Paso 4. Crearemos una nueva clase llamndola PaintPanel indicando que herede
de la clase JPanel. Lo anterior produce una copia exacta del JPanel en nuestra
clase PaintPanel, pero con la ventaja que a esta ltima la podemos adecuar a
nuestras necesidades. Se escribir todo el cdigo en un solo paso, pero
intercalaremos comentarios que ayuden a entender qu se est haciendo.
Teclear arriba de la clase PaintDemo pero debajo de los imports lo siguiente:
//
Esta
clase
extiende
(hereda)
a
JPanel.
Sobrescribe
el
mtodo
//
paintComponent()
de
manera
que
se
dibujen
lneas
aleatorias
en
l.
class
PaintPanel
extends
JPanel
{
Insets
ins;
//
mantiene
el
valor
usado
por
el
marco
del
componente
Random
rand;
//
se
usar
para
generar
nmeros
aleatorios
//
declaracin
del
constructor
por
defecto
del
panel
public
PaintPanel()
{
//
poner
un
borde
rojo
de
grosor
5
alrededor
del
panel
setBorder(BorderFactory.createLineBorder(Color.RED,
5));
rand
=
new
Random();
//
se
crea
una
instancia
de
Random
llamada
rand
}
//
sobrescribimos
el
mtodo
paintComponent()
protected
void
paintComponent(Graphics
g){
Dr.
Hernn
de
la
Garza
Prctica 5 - 4
Prctica 5 - 5
Paso 6. Ir al diseo del frame (dar clic en botn Design). Sobre el rea del
formulario dar clic en botn derecho del mouse o del trackpad, se abre el men
contextual. Seleccionar la opcin Set Layout y enseguida en la nueva ventana,
escoger Border Layout.
Prctica 5 - 6
Prctica 5 - 7
Habr que hacer los ajustes al cdigo para lograr que los rectngulos queden
completos dentro del rea de dibujo. Observe que se dej un ancho y un alto fijos
para los rectngulos pero la posicin de la esquina superior izquierda es variable
ya que usa los valores aleatorios de x e y generados en cada ciclo del for.
Nota: Si se redimensiona la ventana de salida al estarse ejecutando el programa,
provoca que se generen nuevas posiciones para los rectngulos, ya que al
cambiar de tamao el formulario se llama automticamente a repintarse el
componente completo y por ende genera un llamado al paintComponent() de
nuestra instancia pp y produce un juego completo de nuevos valores de x y de y,
provocando que se ubiquen en otras posiciones.
Paso 7. Pruebe las tres instrucciones siguientes:
g.fillArc(x,
y,
20,
20,
0,
360);
//
valores
de
radio
a
y
b
iguales
a
20
g.fillArc(x,
y,
20,
30,
0,
360);
//
dos
valores
de
radio
diferentes
g.fillArc(x,
y,
20,
20,
45,
90);
//
45
es
el
ngulo
de
inicio
y
135
el
ngulo
final,
90
es
el
espesor
de
la
rebanada.
Prctica 5 - 8
Prctica 5 - 9
});
}
//
Variables
declaration
-
do
not
modify
//
End
of
variables
declaration
}
Al ejecutar el cdigo anterior obtenemos la ventana que se muestra enseguida.
Prctica 5 - 10
Al ejecutar nuestro programa hasta lo que tenemos en este momento, al dar clic
en el botn Graficar se muestra la nueva ventana que ser el rea de dibujo de los
grficos.
Prctica 5 - 11
Prctica 5 - 12
ins
=
getInsets();
//
aqu
pondremos
el
cdigo
que
permite
dibujar
los
grficos
}
Prctica 5 - 13
Ver el borde rojo en la ventana es prueba de que se aadi con xito nuestro
panel a la segunda ventana. Observe el cdigo y vea que dejamos el grosor de la
lnea con valor de 1.
An se tienen varios puntos que resolver antes de poder graficar. Hay que definir
un mecanismo para escoger cul tipo de grfico se quiere dibujar, adems definir
la forma en que se le harn llegar los datos ya sea al panel o a la ventana para
que tenga elementos para los grficos, y para finalizar tenemos que hacer que se
construyan los tres tipos de grficos. As que queda un rato ms de instrucciones.
Paso 7. Una manera de elegir el tipo de grfico es incorporando al frame
GraficosLBP un conjunto de Botones de Opcin (RadioButtons) dentro de un
grupo de botones Button Group para que acten acoplados.
Primero arrastramos un componente Button Group dentro del frame GraficosLBP.
Luego arrastramos tres Radio Buttons sobre el mismo frame.
Prctica 5 - 14
Paso 8. Incorporamos una variable de tipo entero que identifique el tipo de grfico
seleccionado. Valor de cero es para grfico de Lneas, uno para Barras y dos para
Pastel. El nombre de la variable ser tipoGra.
public
class
GraficosLBP
extends
javax.swing.JFrame
{
private
JScrollPane
jspDatos;
private
JTable
jtbDatos;
private
VentanaGraficos
VG;
private
PaintPanel
pp;
Dr.
Hernn
de
la
Garza
Prctica 5 - 15
int tipoGra = 0; // se inicializa con cero dado que Lneas es el grfico por defecto
Paso 9. Debemos controlar que cada vez que se haga clic sobre uno de los
botones de opcin (Radio Buttons), el valor de la variable tipoGra se actualice.
Esto se logra programando el evento actionPerformed de cada botn, ya que al
hacer clic en un botn de opcin, est implcito que se seleccion.
Seleccionaremos el evento deseado por otro camino: haga clic sobre el primer
Radio Button( Lneas) para seleccionarlo; luego pulse botn derecho para abrir
men contextual; seleccione eventos; se despliega una nueva ventana, seleccione
action; luego la nica opcin es actionPerformed. Al escoger se muestra la
estructura de cdigo para programar el evento.
Prctica 5 - 16
Paso 10. La manera que usaremos para pasar tanto los datos como el tipo de
grfico escogido, ser por medio de dos nuevas propiedades para nuestra clase
panel PaintPanel. Nosotros le aadiremos esas nuevas propiedades. sto no
podra realizarse sobre el componente original JPanel.
Teclear dentro del cdigo del panel, abajo del mtodo paintComponent(), y
presionar botn derecho para abrir las opciones del men contextual. Seleccionar
Insert Code y en la nueva ventana Add Property. Se despliega la ventana
siguiente:
Prctica 5 - 17
Una vez que se acepta pulsando el botn OK, se aade el cdigo siguiente a
nuestra clase panel PaintPanel:
private
int
tipoGrafico
=
0;
public
int
getTipoGrafico()
{
return
tipoGrafico;
}
public
void
setTipoGrafico(int
tipoGrafico)
{
this.tipoGrafico
=
tipoGrafico;
}
Paso 11. Siguiendo los mismos pasos aadimos la propiedad con nombre datos,
hacemos que sea igual a null y el tipo de dato a manejar es JTable. No olvide dar
clic sobre el botn de opcin que dice private para actualizar la ventana preview.
Despus de aceptar se aade el siguiente cdigo:
private
JTable
datos
=
null;
public
JTable
getDatos()
{
Dr.
Hernn
de
la
Garza
Prctica 5 - 18
return
datos;
}
public
void
setDatos(JTable
datos)
{
this.datos
=
datos;
}
En este momento ya tenemos el mecanismo para hacerle llegar los datos (por
medio de una tabla) y el tipo de grfico que queremos, a nuestro PaintPanel pp.
Paso 12. El momento adecuado para darle los datos a pp es al momento de hacer
clic en el botn graficar, justo despus de haber creado el objeto pp, pero antes de
hacer que se muestre la ventana de dibujo. El cdigo debe modificarse as:
private
void
jbtGraficarActionPerformed(java.awt.event.ActionEvent
evt)
{
VG
=
new
VentanaGraficos(this,
true);
VG.setLocation(200,
200);
VG.setSize(400,
400);
pp
=
new
PaintPanel();
pp.setDatos(jtbDatos);
//
asignamos
los
datos
a
la
propiedad
datos
pp.setTipoGrafico(tipoGra);
//
pasamos
el
tipo
de
grfico
seleccionado
VG.add(pp);
VG.setVisible(true);
}
Paso 13. Ahora ya estamos listos para graficar. El cdigo para dibujar los grficos
estar en el mtodo paintComponent() de la clase PaintPanel. Definiremos dos
variables locales dentro de ste mtodo y las iniciaremos con los valores
obtenidos de las propiedades que le creamos a esta clase, al usar sus mtodos
get:
JTable
datosG
=
getDatos();
int
tipoG
=
getTipoGrafico();
Se ve as:
protected
void
paintComponent(Graphics
g){
super.paintComponent(g);
JTable
datosG
=
getDatos();
//
sacamos
los
datos
para
trabajarlos
Dr.
Hernn
de
la
Garza
Prctica 5 - 19
Prctica 5 - 20
Prctica 5 - 21
g.setColor(Color.blue);
for(int
i=0;
i<6;i++){
int
altoBarra
=
(int)(200
*
(Integer.parseInt((String)datos.getValueAt(i,
1)))/may);
g.fillRect(50
+(20*(i+1)+(30*i)),
250-altoBarra,
30,
altoBarra);
}
break;
//
grfico
de
pastel
case
2:
//
pendiente
de
desarrollar.
}
}
Prctica 5 - 22
HACER:
Pruebe estas instrucciones dentro del case 1 del switch
g.setColor(Color.black);
g.drawString("Grfico
de
Barras",
50,
25);
Prctica 5 - 23
case
0:g.setColor(Color.red);
g.drawLine(50,
50,
50,
250);
//
eje
vertical
tamao
200
g.drawLine(50,
250,
350,
250);
//
eje
horizontal
tamao
300
//
buscamos
al
dato
con
valor
mas
alto
en
segunda
columna
Object
mayor
=
datosG.getValueAt(0,
1);
//
inicializamos
con
el
primer
dato
Integer
may
=
(Integer.parseInt((String)mayor));
for(int
i
=0;
i<6;i++){
if((Integer.parseInt((String)datos.getValueAt(i,
1)))>
may){
may
=
(Integer.parseInt((String)datos.getValueAt(i,
1)));
}
}
g.setColor(Color.black);
g.drawString("Grfico
de
Lneas",
50,
25);
g.setColor(Color.blue);
//
pintamos
primer
dato
con
un
pequeo
crculo
y
definimos
como
dato
anterior
int
altoAnt
=
(int)(200
*
(Integer.parseInt((String)(mayor)))/may);
g.fillArc(70,
250-altoAnt,
5,
5,
0,
360);
for(int
i=1;
i<6;i++){
g.setColor(Color.blue);
int
altoBarra
=
(int)(200
*
(Integer.parseInt((String)datos.getValueAt(i,
1)))/may);
g.fillArc(70+
(i*50),
250-altoBarra,
5,
5,
0,
360);
g.setColor(Color.ORANGE);
g.drawLine(70
+(i-1)*50,
250-altoAnt,
70+(i*50),
250-
altoBarra);
altoAnt
=
altoBarra;
}
break;
//
grafico
de
barras
case
1:g.setColor(Color.red);
..
Prctica 5 - 24
Datos usados
HACER: Realice las mismas adecuaciones a este grfico que las solicitadas en el
punto anterior.
Punto 16. Se dibujar el grfico de pastel. Para ello es necesario calcular la suma
de todos los valores para tomarlo como el 100 % (pastel completo). Enseguida por
medio de proporciones se calcula el porcentaje que le corresponde a cada valor y
Dr.
Hernn
de
la
Garza
Prctica 5 - 25
con este dato se relaciona para obtener los grados de cada rebanada. Recordar
que el pastel completo son 360 grados.
Cdigo para el grfico de pastel opcin del switch: case 2
case
2://definimos
los
clores
para
las
rebanadas
Color[]
arreColores
=
{Color.red,Color.orange,Color.magenta,Color.cyan,Color.green,Color.pink};
g.setColor(Color.red);
//
Calcular
la
suma
de
todos
los
valores
que
ser
el
100
%
int
suma
=
0;
for(int
i
=0;
i<6;i++){
suma
+=
(Integer.parseInt((String)datos.getValueAt(i,
1)));
}
//
calcular
el
porcentaje
para
cada
valor
y
los
grados
que
le
tocan
int
cx
=
100;
//coordenada
x
del
centro
del
pastel
int
cy
=
100;
//
coordenada
y
del
centro
del
pastel
int
angIni
=
0;
//
ngulo
de
inicio
primer
rebanada
for(int
i
=0;
i<6;i++){
int
valorI
=(Integer.parseInt((String)datos.getValueAt(i,
1)));
double
porcientoI
=
(valorI
*
100.0)/
suma;
//
porcentaje
double
gradosI
=
porcientoI
*
360.0
/
100.0;//
ancho
rebanada
en
grados
g.setColor(arreColores[i]);
//una
forma
de
cambiar
de
color
g.fillArc(cx,
cy,
100,
100,
angIni,
(int)Math.round(gradosI));
angIni
+=
gradosI;
}
g.setColor(Color.black);
g.drawString("Grfico
de
Pastel",
50,
25);
}
}
Prctica 5 - 26
Sugerencias Didcticas
La sugerencia en ese caso es que los alumnos realicen la primera prctica
preparatoria y una vez realizada, el instructor les pida un desarrollo y aplicacin
ms a fondo antes de que pasen a la parte dos.
Si bien se ha usado el componente JTable en prcticas anteriores, resultara til el
modificar este componente de manera que se puedan graficar ya sea varias lneas
Dr.
Hernn
de
la
Garza
Prctica 5 - 27
Prctica 5 - 28