2017-02-21 3 views
-1

Ceci est ma classe de grenouille qui est appelée par une classe GUI.Rendre un objet dessiné se déplacer de manière aléatoire sur un JPanel

import java.awt.Color; 
import java.awt.Graphics; 
import java.util.Random; 

import javax.swing.ImageIcon; 
import javax.swing.JLabel; 

public class Frog implements Runnable { 
    private int x, y, dx, dy; 
    private int coordinates[]=new int[2]; 
    private boolean hungry; 
    private JLabel jLabel; 
    private ImageIcon image; 
    private String name; 

    public Frog() { 

    } 

    public Frog(String name, boolean hungry) { 
     image = new ImageIcon("images/frog.jpeg"); 
     jLabel = new JLabel(image); 
     setName(name); 
     setHungry(hungry); 
     setCoordinates(); 
    } 

    private void setName(String name) { 
     this.name=name; 
    } 

    public int[] getCoordinates() { 
     return coordinates; 
    } 

    public boolean isHungry() { 
     return hungry; 
    } 

    public void setHungry(boolean hungry) { 
     this.hungry = hungry; 
    } 

    public void display(Graphics paper) { 
     paper.setColor(Color.black); 
     paper.drawOval(x, y, dx, dx); 
    } 

    public void setCoordinates() { 
     for(int i = 0; i < 2; i++) { 
      Random rand = new Random(); 
      int p = rand.nextInt(100); 
      coordinates[i] = p; 
     } 

     setX(coordinates[0]); 
     setY(coordinates[1]); 
    } 

    public void move() { 
     x = (int)Math.random() * 350; 
     y = (int)Math.random() * 350; 
     dx=20; 
     dx=20; 
     x += dx; 
     y += dy; 

     if (x > 800 || x < 0) 
      dx=-dx; 

     if (y > 600 || y < 0) 
      dy=-dy; 
    } 

    public void setDx(int dx) { 
     this.dx = dx; 
    } 

    public void setDy(int dy) { 
     this.dy = dy; 
    } 

    public void setX(int x){ 
     this.x = x; 
    } 

    public void setY(int y){ 
     this.y = y; 
    } 

    public void run() { 
     while(!hungry) { 
      move(); 

      try { 
       Thread.sleep(100); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

J'ai créé cette classe pour déplacer un objet de grenouille au hasard, mais quand je l'appelle rien de méthode move se passe. Je veux que la grenouille sur un JPanel se déplace au hasard sur l'écran. J'ai une autre classe qui utilise l'objet grenouille.

Il est utilisé d'une classe principale contenant les éléments suivants:

public void actionPerformed(ActionEvent event) { 
    if (event.getSource() == MakePet) { 
     String petName = namePlace.getText(); 
     frog = new Frog(petName,false); 
     panel.add(pet); 
     panel.add(prey); 
     frog.move(); 
     Thread fro = new Thread(frog); 
     fro.start(); 
    } 
} 

public static void main(String[] args) { 
    GUI demo = new GUI(); 
    demo.setSize(520,720); 
    demo.createGUI(); 
    demo.show(); 
} 
+0

Je ne peux pas voir où la grenouille est réellement dessinée. La fonction move() modifie les variables x et y, mais celles-ci ne sont utilisées que pour dessiner un ovale. –

+0

Pourriez-vous poster le code de l'interface graphique, ou au moins des extraits pertinents? Surtout d'où vient l'appel? Aussi, vouliez-vous utiliser 'dy' pour la hauteur de l'ovale? – Sardtok

+0

Cela ressemble à une copie de [cette question] (http://stackoverflow.com/questions/28928256/randomly-moving-images-on-a-jpanel?rq=1) –

Répondre

1

Pour un exemple d'animation à base de minuterie, un coup d'oeil à http://www.java2s.com/Code/Java/2D-Graphics-GUI/Timerbasedanimation.htm

Un autre exemple de l'animation à base de minuterie, où les composants Swing sont utilisé pour dessiner des images sur un JPanel a été donné commentaire de Jérôme: Randomly moving images on a JPanel

Si vous avez besoin de plusieurs grenouilles avec leurs propres threads de contrôle, alors vous devrez gérer la synchronisation. Sinon, j'appellerais simplement le mouvement de la minuterie avant de repeindre le panneau. Et puis changer mouvement:

public void move() { 
    if (!hungry) { 
     return; 
    } 
    ... 
} 

Définir l'intervalle de la minuterie appropriée en fonction de la fréquence d'images que vous cherchez à atteindre. Le ci-dessous est basée sur la réponse de la question liée à Jérôme:

Timer t = new Timer(1000/DESIRED_FRAMERATE, (event) -> { 
    frogs.forEach(Frog::move); 
    panel.repaint(); 
}); 

Notez que ceci est Java 8 en utilisant lambdas.

ci-dessus en pré-Java 8:

Timer t = new Timer(1000/DESIRED_FRAMERATE, new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     for (Frog frog : frogs) { 
      frog.move(); 
     } 
     panel.repaint(); 
    } 
}); 

Vous devez créer la minuterie dans le code d'initialisation de votre JFrame ou JPanel. Si vous avez une classe qui étend JPanel, vous n'avez pas besoin de référencer le panneau lorsque vous appelez repaint si le temporisateur est dans cette classe. Aussi, je suppose que vous avez une collection d'objets Frog, généralement une liste, appelée frogs. S'il n'y a qu'une seule grenouille, vous n'avez pas besoin de la boucle. La méthode d'affichage de Frog doit être appelée à partir de la méthode de peinture de JPanel, donc je suppose que vous avez une classe qui étend JPanel.

+0

Merci pour l'aide, où cette nouvelle méthode serait-elle implémentée dans la classe des grenouilles? – coderrrrrr

+0

S'il vous plaît pour Java 7 – coderrrrrr

+0

Si cela a résolu votre problème, j'apprécierais de le marquer comme une réponse appropriée (case à cocher). Si vous avez besoin de plus d'aide, n'hésitez pas à demander. – Sardtok