Java计时器通过重新绘制加快了速度

Java计时器通过重新绘制加快了速度,java,graphics,timer,jpanel,Java,Graphics,Timer,Jpanel,我目前正在用JPanel中的计时器绘制一些基本图形,但我不明白为什么计时器会呈指数级上升 这是我的密码: public class panel extends JPanel implements ActionListener { int r = 20; Timer forgo; public panel(){ setSize(400,400); } public void paintComponent(Graphics g){

我目前正在用
JPanel
中的计时器绘制一些基本图形,但我不明白为什么计时器会呈指数级上升

这是我的密码:

public class panel extends JPanel implements ActionListener {
    int r = 20;
    Timer forgo;

    public panel(){
        setSize(400,400);
    }

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        g.drawOval(r, 20, 20, 20);
        forgo = new Timer(1000,this);
        forgo.start();
    }

    public void actionPerformed(ActionEvent e) {
        r+=5;
        repaint();
        System.out.println(r);
    }
}
如你所见,我试图在面板的右边缘画一个椭圆形,但我的控制台打印出如下内容:

25
30
35
40
45
50
55
60
65
70
75
80
85
90
95
100
105
110
115
120
125
130
135
140
145
150
155

几秒钟后,我不明白为什么会加速。

您正在
paintComponent()
方法中创建一个计时器,该方法每次重新绘制组件时都会生成一个新计时器

您看到的“加速”是您创建的大量计时器同时生效


您可以尝试只创建一次计时器,这样可以防止这种情况发生。

正如@APerson所说,原因是每次重新绘制
组件时都会产生大量
计时器,当系统第一次调用组件时,它会向内存中添加一个计时器,时间间隔为1000ms,1000毫秒后,
Timer
将重新绘制
组件
,这将导致现在向内存添加一个新的
计时器
,第二个
计时器
也将在1000毫秒后添加一个新的
计时器
重新绘制
组件
和前一个,依此类推

此输出有什么问题?绘制用于绘制,切勿更改可能影响绘制过程的任何内容的状态