A palos con Swing y el repaint.

bloodhound

Hola amigos,

Ahora mismo me encuentro haciendo la parte gráfica del proyecto fin de carrera y lo que os voy a contar me está trayendo de cabeza.

Tengo que representar en un eje de coordenadas determinados datos en forma de puntos y determinadas líneas que los unen. Esa parte ya la he conseguido y aquí está el resultado:

Y ahora los 2 problemas que tengo son:

  • Cuando maximizo la ventana o cambio su tamaño desde los bordes, hace un parpadeo raro donde se ve como las vuelve a dibujar, pero acto seguido se borran quedando solo los ejes de coordenadas.

  • Cuando la ventana pierde el foco (véase que se saca por un lateral del monitor o bien cambias a otra ventana) como que se envían varias peticiones y al final se solapan entre ellas, oscureciendose así las lineas. Ejemplo:

Me he fijado e imagino que tiene que ver con el método repaint y la forma en que se hacen las llamadas.

PD: Aunque no sirva de mucho dejo aquí el código de la clase, por si os orienta en la resolución del problema.

Código
elkaoD

Estás tú que me leo 400 líneas de código xD O lo limpias y dejas lo relevante o es como no poner nada.

2 respuestas
bloodhound

#2 Voy. XD Quitaré las parte de las variables y los setter y getter.

bloodhound

#2 Listo, pero algunas cosas os vais a tener que imaginar, si tenéis dudas de algún método preguntad. He dejado sólo lo relativo a dibujar y aquello que usa repaint. Aunque igual mi problema está por debajo de ese panel (vamos el componente sobre el que está dibujado).

willy_chaos

Nosotros usamos la tecnica del doble buffer, de manera que antes de pintar, esperas a que cargue totalmente la imagen en el buffer.

Evitamos problemas de este tipo.

Busca en google doble buffer java o algo asi.

2 respuestas
Wasd

Para lo del double buffer que dice #5 te dejo este video, que son las cosillas que me estoy mirando yo:

1 respuesta
willy_chaos

Este lo hice yo de cuando haciamos el pong, si no recuerdo mal aqui ya tenia inplementado el doble buffer.

bloodhound

#5 #6 ¡Muchas gracias chicos! Ahora ya me dibuja todo sin problemas. :)

Lo único que está continuamente llamando al método, pero igual es que tengo un bucle por ahí. A ver si lo encuentro. :P

Creo que es el repaint() al final del paintComponent(). ¿Es necesario tenerlo?

#9 Ya me he dado cuenta, lo he quitado de ahí, y lo he puesto justo donde necesitaba que repintase cuando ocurre cierto evento.

willy_chaos

Creo que al final no era necesario, porque habia alguna funcion que ya lo lanzaba, pero esto ya te lo estoy diciendo de memoria (hace 1 año que no toco nada de Java)

1 respuesta

Usuarios habituales

  • willy_chaos
  • bloodhound
  • Wasd
  • elkaoD