2011-09-21 24 views
2

所以在我的java类中,我们有一个作业分配,使用System.currentTimeMillis来显示点击之间的时间量。我试过并尝试过,但它不起作用。这是我的代码。Java System.currentTimeMillis()问题

1 /* Matthew Caldwell 
2 * September 21, 2011 
3 * Homework #4: Problem 5.8.1 pg. 149 
4 * Program that displays the amount of time that passed 
5 * between two mouse clicks. Nothing is displayed 
6 * on the first click, then each successive click will 
7 * display how much time passed between that click and 
8 * the previous one. 
9 */ 
10 
11 import objectdraw.*; 
12 import java.awt.*; 
13 
14 public class ElapsedTimeClient extends WindowController { 
15  
16 public static void main(String[]args) { 
17  new ElapsedTimeClient().startController(800,500); 
18 } 
19 
20 private Text title,result; 
21 private double count = 0; 
22 
23 public void begin() { 
24  
25  // Set up the title and result 
26  title = new Text("CLICK COUNTER", 
27      canvas.getWidth()/2, 
28      20, canvas);29  title.move(-title.getWidth()/2, 0); 
30  result = new Text("", canvas.getWidth()/2, 40, canvas); 
31 
32 } 
33 
34 public void onMouseClick(Location p) { 
35 
36  double timerS=0; 
37 
38  if(count == 0) { 
39  timerS = System.currentTimeMillis(); 
40  } else { 
41  result.setText("The time between clicks was " + 
42      (System.currentTimeMillis() - timerS)/1000 + 
43      " seconds."); 
44  timerS = System.currentTimeMillis(); 
45  } 
46 
47  count++; 
48 
49 } 
50 
51 } 

我真的不想让任何人完全告诉我该怎么做,但我只需要一点指导。我在做什么使这个错误? 代码全部编译并运行得很好,但是当我点击而不是给我点击之间流逝的时间时,它给了我一个永不改变的很长的数字。它几乎每一次都在告诉我1.316639174817E9。

回答

4

首先,以毫为单位的系统时间应该表示为长而不是双。其次,你需要使变量保持自从最后一次点击(timerS)以来的一个实例变量的时间,它的当前方法是本地的,并且每次都重置。

总之,变化:从一个局部变量,实例变量

double timerS=0; 

,长:

public class ElapsedTimeClient extends WindowController { 
long timerS; 
+0

啊,我什至没有想到这一点。我假定它在那种方法中被使用,并且只能用它可以呆在那里的方法。此外,我们班的文字说,长期可以存储为一个双,所以我去了。谢谢你清理那个。我会尝试这些,并让你知道它是如何发生的。 – CaldwellYSR

+0

完美运作。非常感谢你。我会给你投票,但我没有足够的代表。 – CaldwellYSR

+0

@CaldwellYSR - np,你能标记答案是正确的吗? – Joel

2

定时器变量声明内onMouseClick方法的 ,因此在该方法内仅存在。在第一次点击鼠标后,变量消失,不能用于比较时间。

相反,你应该使用类变量来保存这些信息

1

你的问题是:

  • timerS应该是类(而不是局部变量),否则其价值的将不会在您的方法调用之间进行
  • timerS应该是long类型 - 从系统时间返回的类型

另外:

  • count应该是类型int
0

你并不需要定时器double类型。 currentTimeMillis()返回long。

为什么会发生这种情况? 如果使用双类型是这样的:

(double - long)/1000, 

这是上解释:

double/double = double 

所以在结果你有“精确”值(例如1.316639174817E9),而不是漫长的。

1

除了提到的其他答案,System.nanoTime是这种类型的测量的首选方法。这种方法不是测量“时钟时间”的差异,而是测量纳秒数。您经常会发现currentTimeMilils的分辨率不会好于16毫秒左右,而nanoTime可以解决更小的间隔。

+0

是的,我读了一点关于这方面的文档,但System.currentTimeMillis是我们的书的用途,所以这是教授期望我使用的。 – CaldwellYSR