Pergunta

Eu estou chamando repintar um monte de vezes a partir de uma ouvintes, mas do jeito que eu projetei minha função pintura é apenas um repaint é necessária. Eu gerar um monte de repaints, uma vez que enganchado no meu ouvinte movimento do mouse.

Existe uma maneira para cancelar todas as repaints pendentes de um determinado componente? Eu não posso simplesmente começar a ignorar repaints, uma vez que alguns são válidos como quando você redimensionar o quadro ou restaurá-lo de minimizar.

Por que eu me importo? Porque o meu código de pintura é muito pesado e eu não posso fazer repaints completos em um alto FPS.

Foi útil?

Solução

Balanço irá combinar repaints para você: veja "Pintura em AWT e " balanço no website do Sol. Se você agendar uma série de reconstruções em rápida sucessão, eles vão se combinados em uma única chamada para paintImmediately ().

Outras dicas

solicitações repintar freqüentes são contraídos automaticamente em um. A melhor maneira de otimizar isso não é para pintar a coisa toda, mas chamar repaint com coordenadas da área específica. Isto significa que você pintar apenas a área que realmente mudou.

O meu entendimento é que repaint() simplesmente agenda uma repintura, adicionando uma zona do componente para a fila de repintura. Se um repaint já foi solicitado em um componente, a nova região repintura será apenas unioned com as regiões previamente solicitados. A repintura não é realmente executada até que todos os outros eventos na fila de eventos são manipulados. Assim, seus repaints adicionais pode não fazer muita diferença, ou seja, o seu código de pintura só será executada uma vez. Veja JComponent.repaint e RepaintManager.addDirtyregion .

Eu tenho hackeada algo juntos semelhante ao melhorar a forma como jfreechart decide pintar quando se faz muitas chamadas para repintar.

Essencialmente eu faço o seguinte:

  • Criar um ScheduledExecutorService como um campo na classe
  • Receba primeiro pedido repaint e e submit-lo para o executor para executar no EDT em 50ms digamos retomar o futuro
  • Receber segundo pedido - teste para ver se o repaint anterior tenha terminado (fut.isDone()) e se assim para agendar a próxima repaint; caso contrário, não fazer nada.

Desta forma, você deve ter, no máximo, 20 pedido repaint por segundo.

Já fiz coisas semelhantes para dosadora-se o número de chamadas para fireDataTableChanged quando muitas mudanças estão ocorrendo ao mesmo tempo.

I ouvir o que o seu dizendo. Você pode realmente pintar apenas uma seção da área. No "Executando Personalizado Pintura Exemplos" no site da Sun, eu encontrei um exemplo útil que mostra como desenhar um retângulo arrastado, e só então pintar nessa área quando o mouse está em movimento ou liberado.

Aqui está a seção relevante do 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á sujeito a direitos autorais (ver aqui para o código completo e copyright aviso )

aqui para outro exemplo listagens

A verdade seja dita, eu estou tendo um problema semelhante em FPS, mas isso pode ser devido ao meu código atualmente pobres! Eu aprendi muito ao longo dos últimos meses, que agora posso fazer o meu código de modo mais eficiente. Espero que eu possa superar o problema FPS quando mais de 2 "povo" abrandar meus gráficos! Hummmm ... Eu só implementou o código acima para a mesma seção no meu código, e não outros, mas por todos os meios experimentá-lo!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top