2008-10-08 6 views
0

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).

Répondre

1

Il ne ressemble mélange léger (généralement Swing) et les composants de poids lourds (AWT) ensemble.En passant à Swing, vous devez remplacer chaque dernier composant AWT Swing équivalents (indice: évitez d'importer java.awt. *).

Le filetage est souvent un problème potentiel pour les bogues étranges. Les composants Swing doivent toujours être utilisés sur l'EDT (utilisez java.awt.EventQueue.invokeLater). AWT est thread-safe est la théorie, mais pas dans la pratique - également restreindre l'utilisation à l'EDT.

1

Comme vous avez déjà besoin de Java 1.4, vous devriez envisager quelques petites modifications pour utiliser SWING GUI à la place, il a résolu nos problèmes d'actualisation de l'applet avec AWT. (Mac, Linux, etc.)

Si vous avez par ex. Panel, vous devez le remplacer par JPanel etc.

Vous devez ceci:

import javax.swing.*;