J'ai une routine qui dessine un graphique incroyablement grand à l'intérieur d'un volet de défilement. Il est trop grand pour être dessiné avant d'être ajouté au volet de défilement - les besoins en mémoire seraient de plusieurs gigaoctets.
En raison de la taille du graphique, je rends le graphique dans la méthode paint de l'enfant du volet de défilement. Cela fonctionne bien, cependant je remarque que chaque fois qu'une barre de défilement est déplacée, ma routine de peinture est appelée deux fois - une fois avec un rectangle de rognage égal à la zone non recouverte défilée, et une deuxième fois avec le rectangle de rognage égal aux dimensions du portail.
Par exemple, si mon portail a pour dimensions 245x195 et que je fais défiler de 3 pixels vers le bas, ma routine de peinture est appelée avec g.getClipBounds()
défini comme suit :
java.awt.Rectangle[x=0,y=195,width=245,height=3]
java.awt.Rectangle[x=0,y=3,width=245,height=195]
... parce que je rends dans la routine de peinture, cela provoque du scintillement (je fais mes calculs aussi vite que possible, mais il y a un petit délai je suppose). Questions :
-
Est-ce que quelqu'un sait comment empêcher le deuxième appel de peinture ? C'est juste le b.a.-ba des JScrollPane que je fais ici - j'ai un composant, je l'ajoute au volet de défilement, j'ajoute le volet de défilement à un composant parent. Vous pouvez voir ce comportement même dans la première démo de défilement d'image sur le tutoriel swing.
-
Si la réponse à la question n°1 est 'non' : est-ce que quelqu'un peut penser à une bonne façon de gérer cela ? Devrais-je peindre sur une sorte de tampon d'image, suivre les appels de peinture récents et copier l'image quand c'est possible ? Je ne peux pas imaginer que cela soit beaucoup plus rapide que le re-rendu, mais toute idée est appréciée :-)