Foros del Web » Programación para mayores de 30 ;) » Java »

Problema con repaint en JFrame

Estas en el tema de Problema con repaint en JFrame en el foro de Java en Foros del Web. Buenos días, Ante todo presentarme, y dar las gracias a la comunidad de antemano por acogerme Soy estudiante de informática y estoy programando en Java ...
  #1 (permalink)  
Antiguo 05/05/2012, 04:40
 
Fecha de Ingreso: mayo-2012
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
Problema con repaint en JFrame

Buenos días,

Ante todo presentarme, y dar las gracias a la comunidad de antemano por acogerme

Soy estudiante de informática y estoy programando en Java un Space Invaders muy simple pero me estoy topando con unos incómodos provblemas.

Lo primero de todo es que despues de añadir los "Listeners" a las teclas que quiero usar, solo me hace caso si, una vez está corriendo la ventana de Java pulso en la tecla "Win" para desplegar el menú de inicio y luego la pulso de nuevo para cerrarla. Muy raro, por lo menos para mi que soy novato.

Pero lo más extraño de todo es lo que pasa con los métodos para pintar por pantalla. En mi "juego" tengo una matriz en la que están todas las naves y el método paint de la clase JFrame recorre esa matriz y cuando encuentra uns nave la pinta como un rectángulo (luego mejoraré esto) si es una nave atacante la pinta de azul y si es la que mueve el usuario roja.
Después tengo unos métodos que mueven las naves y actualizan el frame para qe se vean los cambios. (por cierto estoy desarrollando en BlueJ por obligación de la facultad).

Y aquí viene el poltergeist. Si actualizo el JFrame desde métodos que no usen el teclado (en blueJ se puede hacer haciendo metodos en el main que son accesibles pulsando el botón derecho sobre los objetos) todo funciona "bien" y lo pongo entre comillas porque el fondo empieza siendo blanco y luego pasa a gris, pero salvo por ese detalle todo va bien.
Pero si llamo al método de actualizar desde los eventos del teclado, me duplica las naves cuando se mueven, es decir, pinta la nueva nave pero la antigua, que tiene que borrarla, no lo hace.

Alguien me puede ayudar?

Muchas gracias de antemano y si se necesita posteo el código.
  #2 (permalink)  
Antiguo 05/05/2012, 04:59
 
Fecha de Ingreso: mayo-2012
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con repaint en JFrame

Buenos, pongo el código de mi clase "Inout" que es la encarga de pintar por pantalla y de escuchar el teclado.


import javax.swing.*;
import java.awt.*;
import java.util.List;
import java.util.*;
import java.awt.Graphics;
import javax.swing.JFrame;
import java.awt.Color;
import java.awt.event.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


/**
* Clase para la represantación por pantalla de los elementos y
* para procesar la entrada de datos por el teclado
*/
public class Inout
{

private static Canvas canvas;
private Motor motor;

/**
* Declaración de constructor
*/

public Inout()
{
motor = new Motor();
canvas = new Canvas();

}

public static void actualizar()
{
canvas.removeAll();
SwingUtilities.updateComponentTreeUI(canvas);
}




/**
* Clase interna para pintar por pantalla e implementar el teclado
*/
public class Canvas extends JFrame implements KeyListener
{


/*
* Constructores de la clase
*/

public Canvas ()
{
addKeyListener(this);
setFocusable(true);
setFocusTraversalKeysEnabled(false);
setTitle("Space Invaders");
setSize(1200,600);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}

public void paint(Graphics g)
{
//g.drawRect(0,0,100,100);

int i = 0;
int j = 0;
for (i = 0; i < 30 ; i++)
{
for (j = 0; j < 50; j++)
{
if (Motor.cuadricula[i][j].esUfo())
{
g.setColor (Color.blue);
g.fillRect(i*40,j*20,20,15);
}
else if (Motor.cuadricula[i][j].esDef())
{
g.setColor (Color.red);
g.fillRect(i*40,j*20,20,15);
}
}
}

}

//Métodos para la entrada de teclado

public void keyPressed(KeyEvent e)
{


/*int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_O){
Motor.moverAbajo();
SwingUtilities.updateComponentTreeUI(this);
}*/

}

public void keyReleased(KeyEvent e)
{
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_P){
Motor.moverDef(1);//mover una casilla a la derecha

}
else if(keyCode == KeyEvent.VK_O){
Inout.actualizar();
Motor.moverDef(0);//mover una casilla a la izquierda
Inout.actualizar();
}
}

public void keyTyped (KeyEvent e)
{

}


}

}
  #3 (permalink)  
Antiguo 05/05/2012, 08:37
Avatar de chuidiang
Colaborador
 
Fecha de Ingreso: octubre-2004
Mensajes: 3.774
Antigüedad: 20 años, 2 meses
Puntos: 454
Respuesta: Problema con repaint en JFrame

Hola:

"que tiene que borrarla" ... ¿cual es el código que la borra?

Posiblemente en el código de "if (esUfo()) pinta ufo else if (esDef()) pinta def" debería ser "if (esUfo()) pinta ufo else if (esDef()) pinta def else pinta vacío"

Se bueno.
__________________
Apuntes Java
Wiki de Programación
  #4 (permalink)  
Antiguo 05/05/2012, 17:24
 
Fecha de Ingreso: mayo-2012
Mensajes: 3
Antigüedad: 12 años, 7 meses
Puntos: 0
Respuesta: Problema con repaint en JFrame

Gracias por la respuesta chuidiang.

El código que la borra realmente no es tal, sino que cuando el método de mover mueve la nave, borra la antigua de su sitio, por tanto el método paint ya no la encontrará ahí cuando la busque.

Al final lo he solucionado cambiando el método paint y poniendo esta sentencia como la primera:
public void paint(Graphics g) {
super.paint(g);

Ahora mi problema es otro....

¿Por qué tengo que dar dos veces al a tecla "win" para que el programa "escuche" las órdenes del teclado?

Un saludo

Etiquetas: clase, jframe, programa, repaint
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:30.