2015-03-15 2 views
0

J'essaie de déplacer un objet de manière aléatoire. J'ai ma classe GUI qui utilise une autre classe (disons Obj) pour créer une nouvelle image et ensuite démarrer le thread pour que l'objet bouge aléatoirement. Mais mon repaint() ne fonctionne pas dans ce contexte. Le code ci-dessous peut vous donner une idée de la façon dont j'utilise la méthode de repeint. merci,méthode repaint pour déplacer un objet au hasard

classe Gui

public class GUI extends JFrame implements ActionListener { 

    public void addNewObj(){ 
       Obj f = new Obj(); 
       x = panel.getGraphics(); 
       f.paint(x); 
       Thread thr=new Thread(f); 
       thr.start(); 
      } 
    } 

Créer une classe d'objets

public class Obj extends JPanel implements Runnable 
{ 

public Obj() 
{ 


    try { 
    myImage = ImageIO.read(new File("b:\\imgs\\bottle.jpg")); 
    } 
     catch (IOException e) {} 
} 

public void run() 
{ 
    long beforeTime, timeDiff, sleep; 
    beforeTime = System.currentTimeMillis(); 
    while (true) 
    { 

     timeDiff = System.currentTimeMillis() - beforeTime; 
     sleep = DELAY - timeDiff; 


     try 
     { 
      moveRandom(); 
      repaint(); 
      Thread.sleep(1000); 
     } 
     catch (InterruptedException e) 
     { 
      System.out.println("interrupted"); 
     } 

     beforeTime = System.currentTimeMillis(); 
    } 
} 

Répondre

2

Le problème est très simple: Ne jamais peindre un objet de la manière que vous faites. Vous devriez l'ajouter au cadre ou à un conteneur. C'est aussi la raison pour laquelle repaint() ne fonctionne pas. Votre objet ne le fait jamais dans le componenthierachy, et donc repeindre ne repeindra que cet objet unique, mais rien d'autre (y compris le cadre, qui devrait être repeint). Ajoutez simplement l'objet directement au cadre, validez et repeignez le cadre.

les nouveaux addNewObj:

public void addNewObj(){ 
     Obj f = new Obj(); 

     Thread t = new Thread(f); 
     t.start(); 

     panel.add(f);//add it to the panel 
     panel.validate();//validate the hierachy 
     panel.repaint();//repaint the whole thing to make the new obj visible 
} 

et passer outre votre classe Obj pour peindre les objets:

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.drawImage(myImage , 0 , 0 , Color.white , null); 
} 
+0

Merci pour la réponse. pourriez-vous s'il vous plaît me donner un exemple avec un morceau de code. – user2119807

+0

sûr, mal éditer, juste une seconde. – Paul

+0

merci pour votre réponse rapide. Je comprends ce que vous mais je suis un novice. J'ai déjà ma méthode de peinture (voir ci-dessous) pour afficher mon image. Si j'utilise votre code, je n'obtiens aucune image mais de petits carrés vides qui ne bougent pas. peinture de vide publique 'code' (Graphiques g) { super.paint (g); Graphics2D g2d = (Graphics2D) g; g2d.drawImage (frogImage, x, y, this); Toolkit.getDefaultToolkit(). Sync(); g.dispose(); } 'code' – user2119807