Question

Nous avons une applet Java créée à l'aide de AWT. Cette applet vous permet de sélectionner des images sur votre disque dur et de les télécharger sur un serveur. L'applet comprend une liste déroulante d'images, qui fonctionne parfaitement sous Windows, Linux et Mac OS X 10.5. Nous lançons cette applet via Java Web Start ou dans une page Web.

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, les images chevauchent l'en-tête ou le pied de page de l'application. Ce problème ne se produit pas sur d'autres plates-formes. Sous Mac OS X 10.4, les images se trouvent à un emplacement incorrect lors du défilement, ce qui ne serait pas si grave si cela rafraîchissait l'écran après avoir peint l'image à cet emplacement. Cependant, il ne semble pas que l’application sache qu’elle l’a peinte de manière incorrecte et ne se régénère donc pas.

Si la fenêtre est réduite, redimensionnée ou même déplacée, l'application est régénérée, les éléments mal positionnés disparaissent et l'application reprend normalement. J'ai passé un certain temps à essayer de forcer une actualisation de l'image d'arrière-plan sans succès. (je repeindreai directement l'image, tous les enfants de quelques panneaux, etc.) rafraîchir.

Jusque récemment, tout était compatible avec Java 1.1, mais cela a changé dans quelques endroits qui nécessitent maintenant la version 1.4. Je ne pense pas que ces changements aient créé le problème, je fournis simplement ceci à titre d'information supplémentaire. Si vous souhaitez en savoir plus sur les détails de la mise en œuvre du panneau de défilement, j’enquêterai, mais je suppose qu’il s’agit d’un bogue commun de la plateforme pour lequel des solutions de contournement doivent être connues.

Pour répliquer le problème, ouvrez l'application Java Web Start suivante: http://www.lavablast.com/tmp/opal-webstart.php. jnlp

Sélectionnez un dossier contenant de nombreuses images et jouez avec la barre de défilement. À un moment donné (assez rapidement), vous devriez avoir le problème de rafraîchissement.

Modifier: j’ai suivi la première suggestion ici et remplacé toutes mes commandes qui comportent des images d’arrière-plan par un équivalent de Swing et le problème est toujours là. (De plus, il y a de nombreuses autres corrections que je devrais faire pour effectuer un changement complet). D'autres idées? Une simple ligne de code imposant une actualisation complète serait très utile:)

Edit2: le thread principal crée les panneaux et lance les threads X. À l'aide d'un modèle observateur / notificateur, les threads sont terminés et notifient le contrôle principal, ce qui ajoute un panneau à la page. Cela se fait via un EventQueue.invokeLater qui, sauf erreur de ma part, devrait s'exécuter sur le bon thread. Le problème est particulièrement grave lors du défilement, même si aucun thread supplémentaire n'est en cours d'exécution (comme lors du chargement).

Était-ce utile?

La solution

Cela ressemble au mélange de composants légers (généralement Swing) et lourds (AWT). Si vous passez à Swing, vous devez remplacer tous les derniers composants Swing équivalents à un composant AWT (astuce: évitez d'importer java.awt. *).

Le filetage est souvent un problème potentiel pour les bugs impairs. 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 - limitez également l'utilisation à l'EDT.

Autres conseils

Comme vous avez déjà besoin de Java 1.4, vous devez envisager quelques modifications mineures à prendre en compte pour l’utilisation de l’interface graphique SWING, ce qui a permis de résoudre nos problèmes d’actualisation des applets avec AWT. (Mac, Linux, etc.)

Si vous avez par exemple Panneau, vous devez le remplacer par JPanel, etc.

Vous avez besoin de ceci:

import javax.swing.*;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top