我想做的事情:为矩形设置动画,使它们从屏幕右侧移动到屏幕左侧。这是绘画的代码:
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();
}
}
我的问题:正如您所看到的,似乎矩形移动的距离是他们上次移动的距离的两倍。
我的问题:我做错了什么?我需要知道它是否与定时器或我正在使用的等式有关。
答案 0 :(得分:2)
我需要知道它是否带有计时器
A painting method should only ever do painting!
它不应该启动Timer
。每次绘制组件时,都会启动另一个Timer
,因此最终会生成多个repaint()请求。然后RepaintManager
将多个请求组合成一个组件重绘。
Timer应该在类的构造函数中启动,或者您应该创建一个startAnimation()
方法方法并将其添加到面板中。然后可以在框架可见(或根据需要)后调用该方法。
此外,类名应始终以大写字母开头。但是你不应该使用" Graphics"因为已经有一个具有该名称的Java类。使您的班级名称更具描述性。