2017-02-21 4 views
-1

Это мой класс лягушек, который вызывается классом GUI.Сделать рисованный объект случайным образом перемещаться по 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(); 
      } 
     } 
    } 
} 

Я создал этот класс, чтобы переместить объект лягушки случайно, но когда я называю move метод ничего не происходит. Я хочу, чтобы лягушка на JPanel случайно перемещалась по экрану. У меня есть другой класс, который использует объект лягушки.

Он используется из основного класса, содержащего следующие:

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

Я не вижу, где действительно нарисована лягушка. Функция move() изменяет x и y vars, но они используются только для рисования овала. –

+0

Не могли бы вы опубликовать код GUI или, по крайней мере, соответствующие фрагменты? Особенно, где вызывается отображение? Кроме того, вы имели в виду использовать 'dy' для высоты овала? – Sardtok

+0

Кажется, что это дубликат [этот вопрос] (http://stackoverflow.com/questions/28928256/randomly-moving-images-on-a-jpanel?rq=1) –

ответ

1

Для примера анимации таймера на основе, имеют вид на http://www.java2s.com/Code/Java/2D-Graphics-GUI/Timerbasedanimation.htm

Другой пример анимации на основе таймера, где компоненты Свинг являются используемый для рисования изображений на JPanel, был дан комментарий Jérôme: Randomly moving images on a JPanel

Если вам требуется наличие нескольких лягушек со своими потоками управления, вам потребуется обработать синхронизацию. В противном случае я просто позвоню, перейдя из таймера, прежде чем перекрашивать панель. А затем смените ход:

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

Установите интервал таймера соответствующим образом на основе частоты кадров, которую вы ищете. Ниже на основе ответа от вопроса, связанного с Жером:

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

Обратите внимание, что это Java 8, используя лямбды.

выше в предварительном Java 8:

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

Вы должны создать таймер в коде инициализации вашего JFrame или JPanel. Если у вас есть класс, расширяющий JPanel, вам не нужно ссылаться на панель при вызове перерисовки, если таймер находится внутри этого класса. Кроме того, здесь я предполагаю, что у вас есть коллекция объектов Frog, как правило, список, называемый frogs. Если есть только одна лягушка, вам не нужен цикл. Метод отображения лягушки нужно вызвать из метода рисования JPanel, поэтому я предполагаю, что у вас есть класс, расширяющий JPanel.

+0

Благодарим вас за помощь, где этот новый метод будет реализован в классе лягушек? – coderrrrrr

+0

Пожалуйста, для java 7 – coderrrrrr

+0

Если это решило вашу проблему, я был бы признателен за ее указание в качестве подходящего ответа (флажок). Если вам нужна дополнительная помощь, не стесняйтесь спрашивать. – Sardtok