Nous avons créé une applet Java utilisant AWT. Cette applet vous permet de sélectionner des images de votre disque dur et de les télécharger sur un serveur. L'applet comprend une liste déroulante d'images, qui fonctionne correctement sous Windows, Linux et Mac OS X 10.5. Nous lançons cette applet via Java Web Start ou dans une page Web.Java Applet, AWT Refresh, problème sous Mac OS X 10.4
Notre applet ne se comporte pas correctement sous Mac OS X 10.4, quelle que soit la version de Java (1.4 ou 1.5). Vous pouvez trouver une capture d'écran du comportement incorrect, lors du défilement, ici:
http://www.lavablast.com/tmp/ui_error.png
En termes simples, parfois lors du défilement des images finissent par se chevauchent l'en-tête ou le pied de l'application. Ce problème ne se produit pas sur les autres plates-formes. Sur Mac OS X 10.4, il affiche les images à l'emplacement incorrect lors du défilement, ce qui ne serait pas si grave si l'image était rafraîchie après avoir peint l'image à cet endroit. Cependant, il ne semble pas que l'application sache qu'elle a été peinte de manière incorrecte et qu'elle ne s'actualise donc pas.
Si la fenêtre est réduite, redimensionnée ou même déplacée, l'application est actualisée et les éléments mal positionnés disparaissent et l'application reprend normalement. J'ai passé un certain temps à essayer de forcer un rafraîchissement de l'image de fond sans succès. (repeindre l'image directement, repeindre tous les enfants de quelques panneaux, etc.) Donc, je cherche des astuces qui pourraient m'aider à résoudre ce problème sous Mac OS X 10.4 ou, dans le pire des cas, simuler simplement une applet complète rafraîchir. Jusqu'à récemment, tout était compatible avec Java 1.1 mais cela a changé dans quelques endroits qui nécessitent maintenant 1.4. Je ne pense pas que ces changements ont créé le problème, je fournis simplement cela comme information supplémentaire. Si vous êtes intéressé par les détails de mise en œuvre du panneau de défilement, je vais enquêter, mais je suppose qu'il s'agit d'un bug de plate-forme commune pour laquelle des solutions de contournement doivent être connues.
Pour répliquer le problème, ouvrez la suite de l'application Java Web Start: http://www.lavablast.com/tmp/opal-webstart.php.jnlp
Sélectionnez un dossier contenant beaucoup d'images et de jouer avec la barre de défilement. À un moment donné (assez rapidement), vous devriez obtenir le problème d'actualisation. Editer: J'ai suivi la première suggestion ici et remplacé tous mes contrôles qui disposent d'images de fond avec un équivalent Swing et le problème est toujours là. (De plus, il y a beaucoup d'autres corrections que je devrais faire pour faire un changement complet). D'autres idées? Une simple ligne de code qui force un rafraîchissement complet serait génial :)
Édition2: Le thread principal crée les panneaux et lance X fils. En utilisant un modèle observateur/notificateur, les threads se terminent et notifient le contrôle principal, ce qui ajoute un panneau à la page. Ceci est fait via un EventQueue.invokeLater qui, à moins que je ne me trompe, devrait fonctionner sur le bon thread. Le problème est le plus grave lors du défilement même si aucun thread supplémentaire n'est en cours d'exécution (comme lors du chargement).