Reputation: 3196
So in my java class we have a homework assignment to use System.currentTimeMillis
to display the amount of time between clicks. I've tried and tried but it isn't working. Here's my code.
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 }
I don't really want anyone to completely tell me how to do it but I just need a little guidance. What am I doing to make this wrong? The code all compiles and runs just fine but when I click instead of giving me the time that elapsed between clicks it's giving me a big long number that never changes. It's telling me 1.316639174817E9 almost every single time.
Upvotes: 2
Views: 3965
Reputation: 4869
In addition to the other answers mentioned, System.nanoTime
is the preferred method for this type of measurement. Rather than measuring the difference in "clock time", this method measured the number of nanoseconds. You will often find that the resolution on currentTimeMilils
is no better than around 16 ms, whereas nanoTime
can resolve much smaller intervals.
Upvotes: 1
Reputation: 26799
You don't need double type for timerS. currentTimeMillis() returns long.
Why this happend? If you use double type like this:
(double - long) / 1000,
this is interpreted on:
double / double = double
So in the result you have "precise" value (e.g. 1.316639174817E9) instead of long one.
Upvotes: 0
Reputation: 424973
Your problems are:
timerS
should be a field of the class (not a local variable) otherwise its value will not be held between calls to your methodtimerS
should be of type long
- the type that's returned from the system timeAlso:
count
should be type int
Upvotes: 1
Reputation: 285415
the timerS variable is declared inside of the onMouseClick method, and thus only exists within this method. After your first mouse click, the variable disappears and can't be used to compare times.
Instead you should use a class variable to store this information in.
Upvotes: 2
Reputation: 30146
Firstly, system time in millis should be represented as a long, not a double.
Secondly, you need to make the variable that holds the time since the last click (timerS) an instance variable, it's currently method local and so reset every time.
In short, change:
double timerS=0;
from being a local variable, to an instance variable, and a long:
public class ElapsedTimeClient extends WindowController {
long timerS;
Upvotes: 4