2017-08-21 1 views
0

Actuellement, j'utilise ce code:Comment entraîner une image dans JPanel

public void mouseDragged(MouseEvent e) { 

      try { 
       repaint(); 
       getGraphics().drawImage(TreeDrag.obj.getImg(), getMousePosition().x, getMousePosition().y, null); 
      } catch (HeadlessException | IOException e1) { e1.printStackTrace(); } 

     } 

dans ma classe JPanel. Quoi qu'il en soit le résultat est le suivant: Gif1

si je retire la méthode repaint() le résultat est: Gif2

L'image pour faire glisser est un BufferedImage objet

Ma question est: Comment puis-je faire le glisser sans scintillement ou effets de serpent?

+1

Pour une meilleure aide plus tôt publier un bon [mcve] – Frakcool

Répondre

0

Ce n'est pas ainsi que fonctionne le mécanisme de peinture en Java. Pour expliquer votre problème, vous devez comprendre ces points:

  • Lorsque vous voulez peindre quelque chose en permanence, vous devez remplacer la méthode paintComponent() de votre appareil pour dessiner les choses que vous voulez. Vous devez donc stocker le nouvel emplacement de l'image dans le panneau et appeler drawImage (image, newLocation.x, newLocation.y) dans la méthode paintComponent() du panneau. Lorsque vous essayez d'obtenir Graphics() et de peindre quelque chose, les éléments que vous peignez apparaîtront immédiatement, mais ils seront effacés lors de la prochaine peinture. C'est parce que chaque rond de peinture efface toutes les vieilles choses peintes et demande à tous les composants de peindre de nouvelles choses à nouveau. Lorsque vous déclenchez repaint(), vous demandez un nouveau cycle de peinture, cette demande est planifiée et coalesce ce qui n'arrive pas immédiatement, mais est garanti pour arriver plus tard. Vous devriez toujours appeler repaint() au lieu d'appeler getGraphics(). DoSomething(), sans mentionner que getGraphics() peut renvoyer une valeur nulle si le composant n'est pas affiché. Cela explique pourquoi avec repaint(), l'image scintille, parce que votre appel à getGraphics(). DrawImage() l'oblige à dessiner quelque chose immédiatement, puis vous avez déclenché un nouveau round de paint(), qui a effacé contenu, mais vous ne fournissez pas quelque chose de nouveau à dessiner. Cela a provoqué l'image affichée puis l'effet effacé de l'image. Mais si sans repeindre(), vous avez forcé l'image à la nouvelle position à dessiner immédiatement, mais l'ancien contenu n'a jamais été effacé, a provoqué l'effet de serpent.