2012-08-27 6 views
2

Ma classe ressemble à ceci.Impossible de faire repaint() travail

import java.awt.*; 
import javax.swing.*; 

public class Painter extends JPanel { 
    int x=200; 
    int y=200; 
    int newX; 
    int newY; 

    Painter(){ 
      setPreferredSize(new Dimension(400,400)); 
    } 

    public void moveSquare(int newX, int newY){ 
      if(newY != y|| newX != x){ 
       repaint(x,y, 10, 10); 
       y = newY; 
       x = newX; 
       repaint(x,y, 10, 10); 
      }   
    } 

    public void paintComponent(Graphics g){ 
      super.paintComponent(g); 
      g.setColor(Color.BLACK); 
      g.fillRect(x, y, 10, 10); 
    } 
} 

Les méthodes sont appelées à partir d'une autre classe. Les valeurs pour x et y changent comme elles le devraient. Cependant, le carré ne bouge pas. Ai-je fait quelque chose de mal ici?

EDIT Oui, j'appelle "super". Je l'ai juste effacé accidentellement quand j'ai copié et édité le code ici. Maintenant édité avant.

+0

Eh bien, vous êtes sur le bon site. C'est sûr. –

+0

Essayez d'appeler simplement 'repaint()' :-) – oldrinb

+0

Peut-être que vous devriez utiliser un 'Canvas', de toute façon. – oldrinb

Répondre

4

Vous devez appeler super.paintComponent(g) plutôt que paintComponent(g)

dans

public void paintComponent(Graphics g) 

sinon vous boucle indéfiniment.

+0

Je me demande pourquoi @spacitron n'obtient pas une boucle infinie – user949300

+0

@ user949300 Il a probablement des débordements de pile sur le thread appelant paintComponent(). –

+0

Oui, j'appelle super.Je l'ai juste effacé accidentellement quand j'ai copié et édité le code ici. – spacitron

2

L'appel repaint(x, y, w, h) définit uniquement une région sélectionnée comme étant sale; Graphics définit un clip autour de cette limite, et vous ne verrez que les changements qui s'y produisent. L'utilisation repaint() sans aucun argument marquera toute la zone comme sale :-)

Selon un article Oracle sur AWT paint (trouvé here),

Lorsque AWT invoque cette méthode, le paramètre d'objet Graphics est pré avec l'état à configuration approprié pour l'élaboration de ce composant particulier:

  • le de l'objet graphique couleur est réglé sur foreground pro de la composante perty.
  • La police de l'objet Graphics est définie sur la propriété font du composant.
  • La traduction de l'objet Graphics est définie de sorte que la coordonnée (0,0) représente le coin supérieur gauche du composant.
  • Le rectangle du clip de l'objet Graphics est défini sur la zone du composant à repeindre.

Pour tester cela, essayez d'imprimer sur g.getClip :-)

Je vais vous donner un indice ...

java.awt.Rectangle[x=0,y=0,width=10,height=10] 
java.awt.Rectangle[x=0,y=0,width=10,height=10] 
java.awt.Rectangle[x=0,y=0,width=10,height=10] 

est ici fixe moveSquare ..

public void moveSquare(int newX, int newY){ 
    if (newY != y|| newX != x) { 
    y = newY; 
    x = newX; 
    repaint(); 
    }   
}