Maison > Java > javaDidacticiel > Comment puis-je éviter les problèmes de threading de Swing lors de la combinaison de JTextFields et de dessins animés sur un JPanel ?

Comment puis-je éviter les problèmes de threading de Swing lors de la combinaison de JTextFields et de dessins animés sur un JPanel ?

Linda Hamilton
Libérer: 2024-12-31 20:54:14
original
161 Les gens l'ont consulté

How Can I Prevent Swing's Threading Issues When Combining JTextFields and Animated Drawing on a JPanel?

JTextFields au-dessus du dessin actif sur JPanel : problèmes de thread

Supposons que vous souhaitiez créer un environnement de rendu multi-tampon approprié au-dessus de quels éléments de l'interface utilisateur Swing peuvent être ajoutés. Il s'agit d'animer un rectangle rouge sur un fond qui ne nécessite pas de mettre à jour chaque image. Au lieu de cela, l'arrière-plan est rendu sur une BufferedImage, et seule la partie nécessaire pour effacer l'emplacement précédent du rectangle est redessinée.

Cependant, après avoir ajouté un JTextField au JPanel et vous être concentré dessus, effaçant l'emplacement précédent du rectangle échoue à chaque clignotement du curseur. En effet, Swing n'est pas thread-safe et l'image est peinte de manière asynchrone.

Pour résoudre ce problème, vous devez invoquer la méthode de la superclasse et effacer l'ancien dessin dans la méthode paintComponent() :

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    int width = this.getWidth();
    int height = this.getHeight();
    g.setColor(Color.black);
    g.fillRect(0, 0, width, height);
    ...
}
Copier après la connexion

Vous pouvez également simplifier le code et l'optimiser si nécessaire. Par exemple, vous n'aurez peut-être pas besoin d'utiliser des encarts, des tampons supplémentaires ou un écouteur de composant.

Addendum :

La définition de la couleur d'arrière-plan dans le constructeur élimine le besoin pour remplir le panneau dans paintComponent(), tandis que super.paintComponent() permet au(x) champ(s) de texte de fonctionner correctement. Comme indiqué, cette solution de contournement est fragile. Il est préférable de simplifier le code et de l'optimiser comme justifié.

Addendum 2 :

super.paintComponent() appelle la méthode update() du délégué de l'interface utilisateur, qui remplit le composant spécifié avec sa couleur d'arrière-plan si sa propriété opaque est vraie. Vous pouvez utiliser setOpaque(false) pour éviter cela.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal