如何获取Java Swing Timer的运行时长(毫秒级)?
解决Java Swing Timer获取运行时长的问题
嘿,我懂你的困扰——Swing的Timer确实没有直接提供value这种获取累计运行时长的属性,但咱们有两种简单靠谱的方式来实现你要的玩家存活时长统计:
方法一:利用系统时间戳(推荐,精度高)
这种方法最直接也最准确,原理是在Timer启动时记录一个起始时间,当玩家死亡时用当前时间减去起始时间,得到的就是精确的毫秒级存活时长。
修改你的代码如下:
public class InvaderPanel extends JPanel implements KeyListener, ActionListener { private int timealive; // 单位:毫秒 private Timer timer = new Timer(30, this); private long startTime; // 记录Timer启动的时间戳 public InvaderPanel() { addKeyListener(this); setFocusable(true); startTime = System.currentTimeMillis(); // 启动前记录时间 timer.start(); } @Override public void actionPerformed(ActionEvent e) { if(playerdead){ timer.stop(); // 注意这里要加括号!原代码少了括号 timealive = (int)(System.currentTimeMillis() - startTime); // 如果担心超过int的最大值(2147483647毫秒≈3.5周),可以把timealive改成long类型 } } }
小贴士:如果你的游戏可能运行超过3.5周(虽然大概率不会),建议把
timealive改成long类型,避免int溢出。另外,System.nanoTime()比System.currentTimeMillis()精度更高,如果你需要更精准的计时,可以用它,计算时转换成毫秒即可:(System.nanoTime() - startTime) / 1000000。
方法二:维护自定义计数器
如果因为某些原因不想依赖系统时间(比如担心系统时间被手动修改),可以在每次Timer触发时累加延迟时间。不过要注意:Swing Timer的触发间隔不是绝对精确的,所以这种方法会有微小误差,但在游戏场景中通常可以接受。
代码示例:
public class InvaderPanel extends JPanel implements KeyListener, ActionListener { private int timealive; private Timer timer = new Timer(30, this); private int elapsedTime = 0; // 累计计时 public InvaderPanel() { addKeyListener(this); setFocusable(true); timer.start(); } @Override public void actionPerformed(ActionEvent e) { if(playerdead){ timer.stop(); timealive = elapsedTime; } else { elapsedTime += timer.getDelay(); // 每次触发累加延迟时间 } } }
另外补充一点:你之前考虑把Timer的delay改成1ms其实没必要,30ms的间隔对应大约30帧每秒,是很适合游戏UI刷新的频率,改成1ms会给UI线程带来不必要的压力,反而可能导致卡顿。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

