Pregunta

Estoy llamando a pintar un montón de veces desde unos oyentes, pero la forma en que he diseñado mi función es la pintura sólo se requiere un repinte. Genero un montón de repintes, ya que engancha en mi oyente movimiento del ratón.

¿Hay una manera de cancelar todos los repintes pendientes para un determinado componente? No puedo empezar haciendo caso omiso vuelve a pintar, ya que algunos son válidos como cuando cambia el tamaño del marco o restaurarla de minimizar.

¿Por qué me importa? Debido a que mi código de la pintura es muy pesado y no puedo hacer repintados completos a muy alta FPS.

¿Fue útil?

Solución

Oscilación combinará vuelve a pintar para usted: ver "en AWT y swing " en el sitio web del Sol. Si programa una serie de repintes en rápida sucesión, que obtendrá combinan en una sola llamada a paintImmediately ().

Otros consejos

frecuentes peticiones de redibujado se contraen automáticamente en una sola. La mejor manera de optimizar esto no quiere volver a pintar todo el asunto, pero llamar a volver a pintar con coordenadas de área específica. Esto significa que se vuelva a pintar sólo el área que en realidad cambió.

Mi entendimiento es que simplemente repaint() horarios de una pintura mediante la adición de una región del componente a la cola de repintado. Si un repintado ya ha sido solicitada en un componente, la nueva región repintado será sólo unioned con las regiones previamente solicitados. El repintado en realidad no se ejecuta hasta que se manejan todos los otros eventos en la cola de eventos. Por lo tanto, vuelve a pintar sus adicionales no pueden hacer una gran diferencia, es decir, el código de la pintura solamente se ejecutará una vez. Ver JComponent.repaint y RepaintManager.addDirtyregion .

He hackeado algo similar en conjunto para mejorar la forma en jfreechart decide a pintar cuando se hace un montón de llamadas para volver a pintar.

En esencia hago lo siguiente:

  • Crear un ScheduledExecutorService como un campo en la clase
  • Recibir primera solicitud repinte y submit y que al ejecutor para ejecutarse en el EDT en 50 ms digamos volver el futuro
  • Recibe segunda solicitud - prueba para ver si el repintado anterior ha terminado (fut.isDone()) y si es así para programar la próxima repinte; de lo contrario no hacer nada.

De esta manera usted debe conseguir como máximo solicitud de repintado 20 por segundo.

He hecho cosas similares para la dosificación hasta el número de llamadas a fireDataTableChanged cuando muchos cambios están ocurriendo al mismo tiempo.

He oído lo que su decir. Efectivamente, puedes volver a pintar solo una sección de área. En el apartado "Realización de encargo Ejemplos de Pintura" en el sitio web de Sun, me encontré con un ejemplo útil que muestra cómo dibujar un rectángulo arrastrado, y sólo volver a pintar esa zona cuando el ratón se mueve o se libera.

Aquí está la sección correspondiente del código ...

public void mouseDragged(MouseEvent e) {
            updateSize(e);
        }

        public void mouseReleased(MouseEvent e) {
            updateSize(e);
        }

        /* 
         * Update the size of the current rectangle
         * and call repaint.  Because currentRect
         * always has the same origin, translate it
         * if the width or height is negative.
         * 
         * For efficiency (though
         * that isn't an issue for this program),
         * specify the painting region using arguments
         * to the repaint() call.
         * 
         */
        void updateSize(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            currentRect.setSize(x - currentRect.x,
                                y - currentRect.y);
            updateDrawableRect(getWidth(), getHeight());
            Rectangle totalRepaint = rectToDraw.union(previousRectDrawn);
            repaint(totalRepaint.x, totalRepaint.y,
                    totalRepaint.width, totalRepaint.height);
        }

Este código está sujeta a derechos de autor (véase aquí por código y aviso de copyright completa )

aquí para más ejemplos de anuncios

A decir verdad, estoy teniendo un problema similar en FPS, pero que puede ser debido a mi mala Actualmente código! He aprendido mucho en los últimos meses, que ahora puedo hacer mi código de manera más eficiente. Espero que pueda superar el problema de FPS cuando más de 2 "gente" lento mi gráficos! Hummmm ... Sólo he implementado el código anterior para la misma sección en mi código, y no a otros, sino por todos los medios que darle una oportunidad!

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