在Java中使用动画上的线程

时间:2013-04-13 21:36:58

标签: java multithreading paint

我创建了一个类两个形状,即两个椭圆形。我在这里画它们。

import ...;

public class Drawings extends JPanel{
    public double degrees = 0;

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        int xcen =  getWidth() / 2;
        int ycen =  getHeight()/ 2;

        int radius = 10;
        degrees++;

        double radians = Math.toRadians(degrees);
        int posx = (int)(100.getDistance() * Math.cos(radians));
        int posy = (int)(100.getDistance() * Math.sin(radians));

        g.setColor(Color.BLUE);
        g.FillOval(xcen + posx, ycen + posy, 20, 20);

        g.setColor(Color.GREEN);
        g.drawOval(xcen + posx, ycen + posy, 100,100)

   }
} 

现在我在main中实现它。

import ....;

public class Animate extends JFrame{
  public static void main(String [] args)
  {

   JFrame window = new JFrame();
   window.add(new Drawings());
   window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   window.setSize(500,500);
   window.setLocationRelativeTo(null); 
   window.setVisible(true);

   //now I implement the thread to animate the two shapes
   Thread paintThread = new Thread(new Runnable(){
   @Override
        public void run(){
              while(true)
              {
                   window.repaint();
                   try{
                        Thread.sleep(25);//determines how slow the ovals will move
                   }catch(InterruptedException e){
                       e.printStackTrace();
                   }
                 }
               }
             });

              paintThread.start();//start the animation

            }  
         }

程序运行时,屏幕上会旋转两个椭圆。但是这两个椭圆以与我预期相同的速度旋转,但我希望两个椭圆以不同的速度移动。

我尝试过使用某种方法以不同的速度移动它们但没有成功。 如何让两个椭圆以不同的速度移动?

2 个答案:

答案 0 :(得分:1)

创建一个表示椭圆形的类。制作两个实例。给两个实例不同的角速度。目前因为你每25毫秒增加1.0度,你的角速度固定在每秒40度。如果每个椭圆都有自己的度数字段,并且您以不同的数量递增两个椭圆,则椭圆将以不同的速率旋转。

答案 1 :(得分:0)

最简单的方法是:

import ...;

public class Drawings extends JPanel{
public double degrees = 0;

private int firstOvalSpeed;
private int secondOvalSpeed;

public void paintComponent(Graphics g){
    super.paintComponent(g);
    int xcen =  getWidth() / 2;
    int ycen =  getHeight()/ 2;

    int radius = 10;
    degrees++;

    double radians = Math.toRadians(degrees);
    int posx = (int)(100.getDistance() * Math.cos(radians));
    int posy = (int)(100.getDistance() * Math.sin(radians));

    g.setColor(Color.BLUE);
    g.FillOval(xcen + posx*firstOvalSpeed, ycen + posy*firstOvalSpeed, 20, 20);

    g.setColor(Color.GREEN);
    g.drawOval(xcen + posx*secondOvalSpeed, ycen + posy*secondOvalSpeed, 100,100)

 }
public void setFirstOvalSpeed(int firstOvalSpeed) {
    this.firstOvalSpeed = firstOvalSpeed;
}

public void setSecondOvalSpeed(int secondOvalSpeed) {
    this.secondOvalSpeed = secondOvalSpeed;
}

} 




public class Animate extends JFrame {
public static void main(String[] args) {

    final JFrame window = new JFrame();
    Drawings drawings = new Drawings();
    drawings.setFirstOvalSpeed(1);
    drawings.setSecondOvalSpeed(2);

    window.add(drawings);
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    window.setSize(500, 500);
    window.setLocationRelativeTo(null);
    window.setVisible(true);

    // now I implement the thread to animate the two shapes
    Thread paintThread = new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                window.repaint();
                try {
                    Thread.sleep(25);// determines how slow the ovals will
                                        // move
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    });

    paintThread.start();// start the animation

}

}