Para este ejercicio cree un Jframe con un panel y varios botn con su respectivo evento.
Todos los componentes poseen lo que se denomina el contexto grafico. La forma de un componente ya sea un botn, tabla,Jlist y dems es definida por un dibujo que se hace sobre dicho contexto grafico. Es posible acceder al contexto grafico de los componentes y dibujar sobre ellos lneas, elipses, rectngulos y polgonos en general.
Para acceder al contexto grafico se usa el mtodo getGraphics que poseen todos los componentes. Por ejemplo, si se quisiera dibujar sobre un botn
Graphics g=[Link]().
El objeto g es el contexto grafico del botn llamado Boton. Cualquier accin de dibujo se har sobre dicho componente.
Dibujar un rectangulo
drawRect(x,y,ancho,alto)
x,y alto
drawOval(x,y,ancho,alto)
ancho x,y alto ancho
Estos mtodos dibujan una
Figura si color de fondo.
drawLine(x1,x2,y1,y2)
X1,y1
X2,y2
setColor(Color): mtodo para establecer el color con el que se dibujan las figuras. Antes de dibujar una figura de un color deseado es necesario establecer dicho color.
Ejemplo:[Link]([Link])
fillRect(x,y,ancho,alto): mtodo para dibujar un rectngulo lleno de un color. fillOval(x,y,ancho,alto): mtodo para dibujar un ovalo relleno de un color.
Para establecer el color de relleno antes de dibujar la figura se debe establecer dicho color con setColor.
Supngase un JPanel como lienzo de dibujo. Coloque este fragmento de cdigo en el evento de un botn.
1 2 3
1.
2. 3. 4. 5.
se extrae el contexto grafico del panel. Las coordenadas de las figuras son relativas a este panel. se dibuja un rectngulo sin relleno y con color de lnea negro( no se ha puesto color) Se coloca el color en rojo y se dibuja un ovalo sin relleno Se coloca el color en verde y se dibuja un rectngulo relleno. Se coloca el color en azul y se dibuja un ovalo relleno. Luego en la misma coordenada(x,y) y con el mismo tamao(ancho,alto) se cambia el color a rojo y se dibuja un ovalo sin relleno. Esta es la manera de dibujar una figura con borde de un color y relleno de otro. El ovalo rojo sin relleno queda encima del azul lleno.
Que pasa si minimizo y maximizo la ventana? Esto es debido a que los dibujos no se almacenan en el componente. Todos los componentes tienen un mtodo llamado paint donde se define grficamente como lucen al usuario. Solo el cdigo de dibujo que se haga all persiste en el tiempo. Este mtodo se llama cada vez que la ventana cambie, ya sea por moverse o esconderse, y como en dicho metodo no esta el cdigo que hizo el dibujo, este no se hace.
En el Jframe defina el metodo paint.
public void paint(Graphics g) { super. paint(g);
//.aqu va el cdigo de dibujo
}
Este metodo recibe como parmetro el graphics del Jframe. Si se dibujara sobre el Jframe, este seria el graphics a usar. Traslade el cdigo que puso en el botn aqu despus del super y vea que pasa cuando minimiza y maximiza.
Entonces si los dibujos que se hagan fuera del paint no persisten en el tiempo, como hacer que esto ocurra?. La respuesta a esto es usar la clase BufferedImage. Esta clase provee un Graphics Virtual el cual luego se puede dibujar en el graphics del componente en cuestin en el mtodo paint.
A continuacin se muestra como crear un BufferedImage. El constructor de esta clase recibe como parmetro el tamao y el tipo de Declarar el objeto color que manejara.
Se instancia y se le asigna el tamao del panel donde se estn haciendo los dibujos. Adems del tipo de color.
BufferedImage.Type_INT_RGB indica que se los dibujos y las imgenes sern en colores RGB. Tambin podra configurarse para imgenes en blanco y negro.
1 2 3
1.
2.
3.
Graphics2D es una clase muy similar a Graphics, posee los mismos mtodos explicados de Graphics adems de otros. El mtodo getGraphics del BufferedImage retorna un Graphics al que hay que realizarle un casting. El BufferedImage por defecto posee un fondo negro, hay que establecer el fondo a blanco(o cualquier color deseado) a traves del metodo setBackGround. clearRect(x,y,ancho,alto) establece el rea que tendr el color de fondo. En nuestro caso dicha rea empieza en 0,0 y tiene el mismo tamao del panel donde se colocara el BufferedImage.
Como se dijo anteriormente, el BufferedImage es un Graphics Virtual. Hay que asignarlo a un componente. Para que los dibujos hechos persistan esto se debe hacer en el paint.
En el paint extraemos el graphics del componente, que en este caso es el JPanel y en el dibujamos el BufferedImage usando el mtodo drawImage. Este mtodo recibe como parmetro, la imagen(BufferedImage), la posicin (x,y) donde se dibujara, el tamao(ancho,alto) que en nuestro caso ser el mismo del panel donde se pondr el BufferedImage y un objeto(que en nuestro caso ser null).
Para dibujar sobre el BufferedImage primero se obtiene el Graphics y a continuacin se usan los mtodo de dibujo explicados anteriormente. Despus de dibujar hay que refrescar el dibujo llamando al mtodo repaint. Si no se hace esto el dibujo no se vera. Este repaint llama implcitamente al Paint donde se dibuja el BufferedImage con el cambio hecho. En un botn dibuje un circulo de relleno rojo.
Los dibujos se hacen sobre este Graphics Obtener Graphics del BufferedImage
Por defecto la lnea que usa el Graphics es de ancho 1 y continua. Es posible crear lnea de mas grosor y con patrones distintos como punteada, lineada, puntos combinada con lnea. Consulte el BasicStroke para crear este tipo de lineas
Este punto(0.0) es el origen del sistema coordenado en el Graphics.
En esta direccin incrementa Y
En esta direccin incrementa X
Crear una grafica a partir de dos vectores, uno X y otro con Y. estos vectores pueden ser el producto de la tabulacin de una funcin.
El sistema coordenado cartesiano es muy distinto al sistema coordenado del graphics.
origen origen En esta direccin incrementa Y Y Incrementa en esta direccin
En esta direccin incrementa X
X Incrementa en esta direccin
En el sistema del Graphics la Y aumenta hacia abajo y en el cartesiano aumenta hacia arriba. Adems los orgenes estn ubicados en sitios distintos. Hay que encontrar una relacin de conversin entre una coordenada cartesiana y su correspondiente coordenada en el graphics.
cartesiano
YMaX
Graphics
0
XMin
XMaX
Ancho
YMin
alto
Se debe establecer una ecuacin que me permita determinar la ubicacin en el graphics de un punto (x,y) cartesiano.
En un panel de
(-3,4) 500x400 la Coord (3,4) -5 Queda ubicada en El punto 40,60 -10 -10 0 (40,60) -5 0 500
400
Por ejemplo, si en un panel de 400 de alto por 500 de ancho se desea crear una grafica desde en x=-5 hasta 5 e y=-10 hasta 10, se tiene que xmin=-5, xmax=5, ymin=10,ymax=10. Cartesiano Graphics Esta tabla muestra
La correspondencia entre Un punto cartesiano y uno En el Graphics
X=-5 X=5 Y=-10 Y=-10 X=0 X=ancho Y=0 Y=alto
Se deben definir dos funciones:
1. Xgraph=f(xCar,anchopanel) 2. Ygraph=f(yCar,altopanel)
X en el graphics depende o es funcin del X cartesiano y el ancho del panel Y en el graphics depende o es funcin del Y cartesiano y el alto del panel.
Usando la ecuacin de una linea recta y-y1=m(x-x1) y m=(y2-y1)/(x2-x1) suponiendo que x1=Xmax,x2=Xmin,y1=anchopanel e y2=0 Y equivale a xgraph que es la variable dependiente de la variable dependiente xcartesiano.
Usando la ecuacin de una linea recta y-y1=m(x-x1) y m=(y2-y1)/(x2-x1) suponiendo que x1=Ymax,x2=Ymin,y1=altopanel e y2=0 Y equivale a ygraph que es la variable dependiente de la variable dependiente ycartesiano.