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); ... }
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!