java中使用timer定时期,但执行速度不是固定的而是越来越快

qq_29720109 2015-07-10 08:31:16
下面是我的程序的一部分
在eclipse中运行时,定时的方法不是每秒运行一次,而是越来越快,求解

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
import javax.swing.JPanel;

public class as extends JFrame {

public static void main(String[] args) {
// TODO Auto-generated method stub
as frame = new as();
jump jump = new jump();
frame.add(jump);
frame.setTitle("跳刺");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 250);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setResizable(false);
jump. setBackground(Color.white);

}

}
class jump extends JPanel {
int a = 794 ;

public void refresh(){

int delay =1000;
ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent arg0){

repaint();

}
};
Timer timer = new Timer(delay,listener);
timer.start();
}

protected void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.print(a+" ");
refresh();
}

}
...全文
365 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_29720109 2015-07-11
  • 打赏
  • 举报
回复
引用 7 楼 Inhibitory 的回复:
每次绘制都会调用 paintComponent,然后调用 refresh,就生成一个 Timer,导致不停的生成 Timer。 把生成 Timer 的代码放到构造函数里就可以了。
原来如此,太感谢了
Inhibitory 2015-07-11
  • 打赏
  • 举报
回复
每次绘制都会调用 paintComponent,然后调用 refresh,就生成一个 Timer,导致不停的生成 Timer。 把生成 Timer 的代码放到构造函数里就可以了。
迎寒 2015-07-11
  • 打赏
  • 举报
回复
目的达到就成
qq_29720109 2015-07-11
  • 打赏
  • 举报
回复
我用的是swing包里的timer你用的是util包里的,不一样吧
迎寒 2015-07-11
  • 打赏
  • 举报
回复
错误就是每次调用后都new了一个新的定时器。 下面是修改后的代码,你复制后就可以运行。 import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Timer; import java.util.TimerTask; import javax.swing.JFrame; import javax.swing.JPanel; public class as extends JFrame { public static void main(String[] args) { // TODO Auto-generated method stub as frame = new as(); jump jump = new jump(); frame.add(jump); frame.setTitle("跳刺"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(800, 250); frame.setLocationRelativeTo(null); frame.setVisible(true); frame.setResizable(false); jump. setBackground(Color.white); } } class jump extends JPanel { int delay =1000; int a = 794 ; public jump(){ java.util.Timer timer; timer = new Timer(true); timer.schedule( new java.util.TimerTask() { public void run() { repaint(); } },0, 1000); }; //Timer timer = new Timer(delay,listener); //timer.start(); protected void paintComponent(Graphics g) { super.paintComponent(g); System.out.print(a+" "); } }
qq_29720109 2015-07-10
  • 打赏
  • 举报
回复
而且我只new了一个timer 啊,并没有设多个
qq_29720109 2015-07-10
  • 打赏
  • 举报
回复
引用 1 楼 attilax 的回复:
可能每次都new了一个timer出来。。。可以设置成单例的。
我才学了不久,好多都不懂 单例是什么意思呢?又怎么设置呢?
attilax 2015-07-10
  • 打赏
  • 举报
回复
可能每次都new了一个timer出来。。。可以设置成单例的。

58,454

社区成员

发帖
与我相关
我的任务
社区描述
Java Eclipse
社区管理员
  • Eclipse
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧