2010-07-25 3 views
0

J'essayais de créer une animation 2D en Java d'une ligne mobile sur le panneau (une ligne se déplaçant d'un point à un autre dans le panneau). J'espère que c'est possible. Voici le code que j'ai utilisé.Panneau non représenté pour l'animation 2D

private void movingline(int length) throws InterruptedException { 
     for(int i = 0; i + length < width; i++){ 
      for(int j = 0; j + length < height; j++){ 
       eraseline(); 
       drawLine(Color.cyan, i, j, i+length, j+length); 
       erase = true; 
      } 
     } 
    } 

    private void eraseline() { 
     if(erase){ 
      fillCanvas(Color.BLUE); 
     } 
    } 

Lors de l'exécution du code, le panneau n'apparaît pas.

Voici le code pour dessiner la ligne.

public void drawLine(Color c, int x1, int y1, int x2, int y2) { 
     int pix = c.getRGB(); 
     int dx = x2 - x1; 
     int dy = y2 - y1; 
     canvas.setRGB(x1, y1, pix); 
     if (dx != 0) { 
      float m = (float) dy/(float) dx; 
      float b = y1 - m*x1; 
      dx = (x2 > x1) ? 1 : -1; 
      while (x1 != x2) { 
       x1 += dx; 
       y1 = Math.round(m*x1 + b); 
       canvas.setRGB(x1, y1, pix); 
      } 
     } 
     repaint(); 
    } 

Lors de l'exécution du code, le panneau ne s'affiche pas avec la ligne en mouvement. Toute aide serait très appréciée.

Répondre

2

Je pense que le plus gros problème est que vous essayez de modifier l'apparence de l'interface graphique de (je suppose) un thread qui n'est pas le thread de distribution d'événements.

La solution consiste à envelopper l'activité (en particulier, les appels à eraseLine et drawLine) dans un Runnable et appeler à l'aide que Runnable SwingUtilities.invokeAndWait().


EDIT: composants graphiques de Java ne vous permettent pas vraiment manipuler la toile vous-même. Seuls les composants effectuent eux-mêmes le dessin, puis uniquement lorsqu'ils sont appelés à se peindre. Dessiner directement sur le canevas, même si vous pouviez le faire fonctionner, fonctionnerait mal parce que vous interféreriez avec ce que fait le composant.

Plutôt que d'aller dans beaucoup plus d'explications, je suis allé et mis en œuvre ce que je pense être le moyen «approprié» de le faire.

http://pastebin.com/etfmKbjj

commentais de Le codage si nécessaire, je l'espère vous donne quelques idées. Pour plus d'informations, lisez les tutoriels officiels sur Swing et Graphics.

+0

Je n'ai pas tout à fait vous. La fonction movingline() est appelée depuis le constructeur de la classe. – razor35

+1

Il y a le problème: Le constructeur de votre classe est probablement appelé par 'main()', et c'est le thread principal. Le dessin doit se produire dans le thread Dispatch d'événement, qui est démarré en interne par Java lorsque vous avez des composants Swing (ou AWT). Pour fonctionner correctement, votre dessin doit être fait dans la méthode 'paint()' du panneau. Vous ne pouvez pas (ou au moins ne devriez pas) appeler 'paint()' directement, cependant. Tout ce que vous pouvez faire de l'extérieur est de définir des variables pour contrôler comment cela fonctionne. –

+0

Mis à jour ma réponse avec un exemple de code et quelques explications. –

Questions connexes