Domanda

che io chiamo ridipingere un mucchio di volte da un ascoltatori, ma il modo in cui ho disegnato la mia funzione Paint è è richiesta una sola ridipingere. I generare un po 'di ridipinge, in quanto agganciato nel mio ascoltatore movimento del mouse.

C'è un modo per annullare tutte le ridipinge in sospeso per un certo componente? Non posso iniziare ignorando ridipinge, dal momento che alcuni sono validi come quando si ridimensiona la cornice o ripristinarlo da ridurre al minimo.

Perché mi interessa? Perché il mio codice vernice è molto pesante e non posso fare ridipinge pieno ad altissima FPS.

È stato utile?

Soluzione

Altalena combinerà ridipinge per voi: vedi "in AWT e swing " sul sito del Sole. Se si pianifica una serie di ridipinge in rapida successione, che otterranno combinate in una singola chiamata a paintImmediately ().

Altri suggerimenti

richieste ridipingere frequenti sono crollati automaticamente in uno. Il modo migliore per ottimizzare questo non è quello di ridipingere l'intera faccenda, ma chiamare ridipingere con le coordinate di specifica area. Questo significa che si ridipingere solo l'area che effettivamente cambiato.

La mia comprensione è che repaint() semplicemente gli orari di ridisegnare con l'aggiunta di una regione del componente alla coda riverniciare. Se un ridisegno è già stato richiesto su un componente, la nuova regione ridipingere sarà solo unioned con le regioni precedentemente richiesti. Il ridisegno non viene effettivamente eseguita fino a quando tutti gli altri eventi nella coda degli eventi vengono gestiti. Così, il vostro ridipinge aggiuntivi non possono fare molta differenza, vale a dire il codice di pittura verrà eseguita una sola volta. Vedere JComponent.repaint e RepaintManager.addDirtyregion .

ho hacked qualcosa di simile insieme per migliorare il modo in JFreeChart decide di dipingere quando si fa un sacco di chiamate di ridipingere.

In sostanza ho effettuare le seguenti operazioni:

  • Crea un ScheduledExecutorService come un campo nella classe
  • Ricevere prima richiesta ridipingere ed e submit per l'esecutore da eseguire sul EDT in 50ms diciamo tornare al futuro
  • Ricevere seconda richiesta - test per vedere se il ridisegno precedente ha terminato (fut.isDone()) e in tal caso per programmare il prossimo ridisegno; altrimenti non fare nulla.

In questo modo si dovrebbe ottenere al massimo 20 richiesta riverniciare al secondo.

Ho fatto cose simili per il dosaggio il numero di chiamate al fireDataTableChanged quando un sacco di cambiamenti stanno accadendo allo stesso tempo.

Ho sentito che cosa il vostro detto. È infatti possibile ridisegnare solo una sezione di zona. Nella sezione "Esecuzione personalizzati pittura Esempi" sul sito Web di Sun, ho trovato un utile esempio che mostra come disegnare un rettangolo trascinato, e solo ridisegnare quella zona quando il mouse è in movimento o rilasciato.

Ecco la sezione del codice ...

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);
        }

Questo codice è soggetto a copyright (vedi qui per il codice e informazioni sul copyright pieno )

qui per ulteriore esempio annunci

A dire il vero, sto avendo un problema simile sul FPS, ma questo può essere dovuto alla mia povera attualmente codice! Ho imparato così tanto nel corso degli ultimi mesi, che ora posso fare il mio codice in modo più efficiente. Spero di poter superare il problema FPS quando più di 2 "persone" rallentare il mio grafica! Hummmm ... Ho implementato solo il codice qui sopra per la stessa sezione nel mio codice, e non altri, ma con tutti i mezzi fare un tentativo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top