Question

Je suis l'appel de repeindre un tas de fois à partir d'un des auditeurs, mais la façon dont j'ai conçu ma fonction de peinture est un seul de repeindre est nécessaire.- Je générer un tas de repeint, car il accroché dans mes mouvements de souris à l'écoute.

Est-il possible d'annuler tous dans l'attente repeint pour un certain composant?Je ne peux pas démarrer en ignorant repeint, puisque certains sont valides comme lorsque vous redimensionnez l'image ou de la restaurer à partir de minimiser.

Pourquoi dois-je prendre soin?Parce que mon code de peinture est très lourd et je ne peux pas faire le plein repeint à un très bon FPS.

Était-ce utile?

La solution

Swing pour vous combiner repeint: voir "Peinture à AWT et swing " sur le site Web de DIM. Si vous planifiez un certain nombre de repeint en succession rapide, ils vont se combiner en un seul appel à paintImmediately ().

Autres conseils

demandes de repeindre fréquentes sont automatiquement regroupées en une seule. La meilleure façon d'optimiser ce n'est pas repeindre la chose, mais appelez repeindre avec les coordonnées de la zone spécifique. Cela signifie que vous repeindre seulement la zone qui réellement changé.

Ma compréhension est que repaint() simplement Planifie un nouveau dessin en ajoutant une région du composant à la file d'attente de repeindre. Si un repeindre a déjà été demandé sur un composant, la nouvelle région de repeindre sera juste avec les régions filles fusionnées précédemment demandées. Le repeindre n'est pas réellement exécuté jusqu'à ce que tous les autres événements dans la file d'attente d'événements sont traités. Ainsi, vos autres ne peuvent pas repaints faire une grande différence, à savoir votre code de peinture ne sera exécutée une fois. Voir JComponent.repaint et RepaintManager.addDirtyregion .

J'ai piraté quelque chose de similaire ensemble pour améliorer la façon dont jfreechart décide de peindre quand il fait beaucoup d'appels à repeindre.

Pour l'essentiel, je procédez comme suit:

  • Créer un ScheduledExecutorService comme un champ dans la classe
  • Recevoir première demande de repeindre et et submit à l'exécuteur testamentaire à exécuter sur le EDT dans 50ms de disons revenir l'avenir
  • Recevoir deuxième demande - test pour voir si la repeindre précédente est terminée (fut.isDone()) et si oui, pour planifier la prochaine repeindre; sinon rien.

De cette façon, vous devriez obtenir au maximum 20 demande de repeindre par seconde.

J'ai fait des choses similaires pour Batching le nombre d'appels à fireDataTableChanged quand beaucoup de changements sont INTERVENUES en même temps.

J'entends ce que vous dites.En effet, vous pouvez repeindre une partie de la zone.Dans la "réalisation de la Peinture Custom Exemples" sur le site web de Sun, j'ai trouvé un bon exemple qui montre comment dessiner un glissé rectangle, puis seulement repeindre cette zone lorsque la souris est en mouvement ou libéré.

Voici la partie de code...

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

Ce code est soumis au droit d'auteur (voir ici pour connaître le code et les avis de droit d'auteur)

Voir ici pour de plus amples exemple des listes

Pour dire la vérité, je vais avoir un problème similaire sur les FPS, mais ça peut être dû à mes pauvres le code!J'ai beaucoup appris au cours des derniers mois, que je peux maintenant faire mon code de manière plus efficace.J'espère que je peux surmonter les FPS problème lorsque plus de 2 "personnes" ralentir le rythme de mes images!Hummmm...J'ai seulement mis en œuvre le code ci-dessus pour le même article dans mon code, et pas d'autres, mais par tous les moyens de lui donner un essai!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top