Pregunta

Tengo una rutina que pinta un increíblemente gráfico grande dentro de un panel de desplazamiento. Es demasiado grande para pintar antes de añadir a la panel de desplazamiento -. Menory los requisitos serían varios conciertos

Debido al tamaño de la gráfica que estoy haciendo que el diagrama dentro del método de pintura del hijo del panel de desplazamiento. ¿Cuál funciona bien, sin embargo estoy notando que cada vez que una barra de desplazamiento se mueve mi rutina de pintura se llama dos veces - una vez con un rect recorte igual al área descubierta desplazado a, y una segunda vez con el rect recorte igual a las dimensiones de la ventana gráfica .

Por ejemplo, si mi vista es 245x195 + i desplazarse hacia abajo por 3 píxeles mi rutina de pintura se llama con g.getClipBounds() establecido de la siguiente manera:

java.awt.Rectangle[x=0,y=195,width=245,height=3]
java.awt.Rectangle[x=0,y=3,width=245,height=195]

... porque me hacen dentro de la rutina de pintura esto está causando el parpadeo (hago mis calculadoras tan rápido como pueda, pero hay un poquito de retraso, supongo). Preguntas:

  1. ¿Alguien sabe cómo prevenir la 2ª llamada pintura Esto se tildan JScrollPane cosas que estoy haciendo aquí? - Tengo un componente, que añadirlo al panel de desplazamiento, lo añadir el panel de desplazamiento a un componente de los padres. Puede ver este comportamiento incluso en la primera imagen de desplazamiento de demostración @ la pivotar tutorial .

  2. Si la respuesta a # 1 es 'nope':? Puede alguien pensar en una buena manera de hacer frente a este ¿Debo pintar a algún tipo de memoria intermedia de imágenes, realizar un seguimiento de las últimas llamadas de pintura y copiar la imagen cuando sea posible? No me puedo imaginar este ser mucho más rápido que volver a la representación, pero alguna idea apreciada: -)

¿Fue útil?

Solución

He encontré con este problema en el mundo .NET. Doblebuffering debería resolver su problema.

Si estás reproduciendo directamente sobre una superficie que se muestra en la pantalla, usted no tiene ningún control sobre cuando la "muestra" que realmente sucede. Lo que normalmente sucede es:. De empezar la representación, la imagen que aún no es terminada se visualiza en la pantalla, que termine de renderizado, y después de que sea finalmente aparece en la pantalla

Si usted comienza su lógica de representación en la limpieza de un color de fondo, entonces esto va a aparecer como un flash. Doblebuffering evita que esto porque siempre se presentan de un render completado. Lo peor que podría pasar es ligero 'desgarro', pero eso es sólo perceptible en cambiar rápidamente animaciones.

Incluso si sólo se desea representar parte de una gigantesca imagen, puede seguir utilizando esta técnica. Simplemente renderizar lo que necesita sobre una superficie fuera de la pantalla (que es el tamaño de la porción visible desea). Y luego, cuando haya terminado, dibujar la imagen entera en su superficie de la pantalla de una sola vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top