You are on page 1of 4

1

1
Dibujando en
Java:
Graphics
2
Sistema de Coordenadas
Cada uno de los Componentes de Java tiene su
propio sistema de coordenadas, que va desde
la posición (vertice superior izquierdo) hasta la
posición determinada por su anchura total y
altura total
3
clase Graphics
Toda la parte gráfica de Java se base en la clase
Graphics
4
El método paint()
Se suele sobrecargar el método paint()
de Component
public void paint( Graphics g ) {
g.fillOval( x,y,d,d );
g.setColor( Color.black );
g.drawOval( x,y,d,d ); }
..
}
5
El método paint()
paint() se invoca con repaint()
public void repaint()
public void repaint( int x,int y,int width,int
height )
...
6
Figuras de Graphics
2
7
Textos de Graphics
La clase Graphics dispone de métodos para
pintar texto:
drawString( String,int,int )
drawChars( char[],int,int,int )
getFont()
getFontMetrics()
getFontMetrics( Font )
setFont( Font )
Font fuenteBold = new Font( "Helvetica",Font.BOLD,12 );
8
Imágenes de Graphics
drawImage( Image,int,int,Color,ImageObserver ),
drawImage( Image,int,int,ImageObserver ),
...
drawImage( Image,int,int,int,int,int,int,int,int,
Color,ImageObserver )
pinta sobre la zona indicada la imagen que se pasa
como parámetro
//carga de una imagen
Image imagen = Toolkit.getDefaultToolkit().getImage(
“dibujo.gif" );
9
Pintando un punto
En un constructor de Jpane:
addMouseListener( new MouseAdapter() {
public void mousePressed( MouseEvent evt )
{
int x = evt.getX();
int y = evt.getY();
}}
punto.x = x;
punto.y = y;
repaint();
UCM
10
paint
public void paint ( Graphics g ) {
super.paint( g );
g.fillRect( punto.x-1,punto.y-1,2,2 );
g.drawString(
"("+punto.x+","+punto.y+")",punto.x,punto.y );
}
UCM
11
paint
Es importante que paint() invoque al metodo que reescribe
public void paint ( Graphics g ) {
super.paint( g );
....
}
el método paint() de la clase java.awt.Container
llama al método paint() de todo lo que haya visible
UCM
12
Una cara
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.black);
g.fillOval(105,70,100,100);
g.setColor(Color.green);
//ojos
g.fillOval(125,100,10,10);
g.fillOval(175,100,10,10);
//boca
g.drawArc(118,120,75,30,180,180);
}
3
13
Dibujando rectas entre puntos
class MiCanvas extends Canvas {
protected Vector puntos;
public MiCanvas( ) {
addMouseListener( new MouseAdapter() {
public void mousePressed( MouseEvent evt )
{
MiCanvas c = (MiCanvas)evt.getSource();
c.puntos.addElement( evt.getPoint() );
c.repaint();
}
});
}
UCM
14
Dibujando rectas entre puntos
public void paint( Graphics g ) {
vectoresPintados = 0;
g.setColor( Color.black );
for( int i=0 ; i < puntos.size()-1; i++ ) {
Point p1 = (Point)puntos.elementAt( i );
Point p2 = (Point)puntos.elementAt( i+1 );
g.drawLine( p1.x,p1.y,p2.x,p2.y );
}
15
Update
repaint() llama a update()
La implementación por defecto de update()
limpia el fondo del componente y luego hace
una llamada a paint()
16
parpadeo
Para evitar el parpadeo, se puede reescribir el método
update en lugar de paint:
public void update( Graphics g ) {
// Solamente se repintan los vectores nuevos
for( int i=vectoresPintados;
i < puntos.size()-1; i++ ) {
Point p1 = (Point)puntos.elementAt( i );
Point p2 = (Point)puntos.elementAt( i+1 );
g.drawLine( p1.x,p1.y,p2.x,p2.y );
}
}
17
Swing:doble-buffering
update() no se invoca sobre componentes Swing
Una de las aportaciones más notables de Swing es
que ha incluido el soporte para operaciones de
doble-buffering que se activa a través de la
propiedad doubleBuffered de
javax.swing.Jcomponent (por defecto true).
public boolean isDoubleBuffered()
public void setDoubleBuffered(boolean o) Swing.
18
Swing
Swing, la llamada a paint() se convierte en la
llamada a tres métodos en el mismo orden:
protected void paintComponent( Graphics g )
protected void paintBorder( Graphics g )
protected void paintChildren( Graphics g )
Los programas que utilicen Swing deberían
sobreescribir el método paintComponent(), en
lugar de sobreescribir el método paint().
Habitualmente no se reescriben los métodos
paintBorder() y paintChildren(),
4
19
Animación
Animación es la presentación de imágenes en
sucesión, cada una con ligeras diferencias
respecto a la anterior
20
Escuchando el teclado
En constructor: addKeyListener(this);
public void keyPressed(KeyEvent e) {
switch (e.getKeyCode()){
case 38:
....;
repaint();
break;
case 40:
...;
repaint();
break;
}}
public void keyReleased(KeyEvent e){}
public void keyTyped(KeyEvent e){}
21
Animación
En main:
while( true ) {
frame.pondatos(....);
frame.repaint();
try { Thread.currentThread().sleep( 50 ); }
catch( InterruptedException e ) {
System.out.println( e ); }
}
}}