计时器动画的问题

时间:2015-08-29 13:57:53

标签: java swing animation timer paintcomponent

我想做的事情:为矩形设置动画,使它们从屏幕右侧移动到屏幕左侧。这是绘画的代码:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JPanel;
import javax.swing.Timer;

public class graphics extends JPanel{

    public static Timer a;

    public static int animation = 0;

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        this.setBackground(new Color(40,40,40));

        g.setColor(new Color(197,255,172));
        g.fillRect(animation, 0, 800, 35);

        g.setColor(new Color(141,229,123));
        g.fillRect(animation, 35, 800, 35);

        g.setColor(new Color(112,183,98));
        g.fillRect(animation, 70, 800, 35);

        g.setColor(new Color(84,137,73));
        g.fillRect(animation, 105, 800, 35);

        g.setColor(new Color(42,68,36));
        g.fillRect(animation, 140, 800, 35);

        g.setFont(new Font("Dekar Light", Font.PLAIN, 30));
        g.setColor(Color.WHITE);
        g.drawString("Graphics Test", 326, 300);

        a = new Timer(1000, new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                repaint();
                int velx = 5;

                animation = animation - velx;
                System.out.println(animation);
            }

        });

        a.start();
    }
}

这是框架: enter image description here

我的问题:正如您所看到的,似乎矩形移动的距离是他们上次移动的距离的两倍。

我的问题:我做错了什么?我需要知道它是否与定时器或我正在使用的等式有关。

1 个答案:

答案 0 :(得分:2)

  

我需要知道它是否带有计时器

A painting method should only ever do painting!

它不应该启动Timer。每次绘制组件时,都会启动另一个Timer,因此最终会生成多个repaint()请求。然后RepaintManager将多个请求组合成一个组件重绘。

Timer应该在类的构造函数中启动,或者您应该创建一个startAnimation()方法方法并将其添加到面板中。然后可以在框架可见(或根据需要)后调用该方法。

此外,类名应始终以大写字母开头。但是你不应该使用" Graphics"因为已经有一个具有该名称的Java类。使您的班级名称更具描述性。