multithreading - Java Timer Program - rubix cube -


i trying make rubix cube timer friend. start timer hold down space bar, , once let go starts. having problem though, when hold down space bar timer starts @ whatever time is. want able reset 0 whenever try glitches out. tell me how fix it, or how in more efficient way? thanks!

package dev.suns.rubix_timer;  import java.awt.color; import java.awt.font; import java.awt.toolkit; import java.awt.event.keyadapter; import java.awt.event.keyevent; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.util.calendar; import java.util.gregoriancalendar; import java.util.timer;  import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.swingconstants;  public class rubixtimermain extends jframe {  private jpanel contentpane; private jlabel labeltimer; private timer timer;  public rubixtimermain() {     createwindow(); }  public static void main(string[] args) {     new rubixtimermain(); }  private void createwindow() {      // setundecorated(true);     setdefaultcloseoperation(jframe.exit_on_close);     setsize(toolkit.getdefaulttoolkit().getscreensize());     setlocationrelativeto(null);     setextendedstate(jframe.maximized_both);     contentpane = new jpanel();      contentpane.setbackground(new color(201, 77, 83));     contentpane.setlayout(null);     setcontentpane(contentpane);      addkeylistener(new keyadapter() {         @override         public void keyreleased(keyevent e) {             if (e.getkeycode() == keyevent.vk_space) {                 starttimer();             }         }     });      jlabel lblminimize = new jlabel("-");     lblminimize.setbounds(1835, -20, 16, 95);     lblminimize.addmouselistener(new mouseadapter() {         @override         public void mousereleased(mouseevent e) {             setstate(jframe.iconified);         }          @override         public void mouseentered(mouseevent e) {             lblminimize.setforeground(color.black);         }          @override         public void mouseexited(mouseevent e) {             lblminimize.setforeground(color.white);         }     });     lblminimize.setforeground(color.white);     lblminimize.setfont(new font("segoe ui", font.plain, 40));     contentpane.add(lblminimize);      jlabel lblx = new jlabel("x");     lblx.setbounds(1873, 0, 24, 54);     lblx.addmouselistener(new mouseadapter() {         @override         public void mousereleased(mouseevent e) {             system.exit(0);         }          @override         public void mouseentered(mouseevent e) {             lblx.setforeground(color.black);         }          @override         public void mouseexited(mouseevent e) {             lblx.setforeground(color.white);         }     });      lblx.setfont(new font("segoe ui", font.plain, 40));     lblx.sethorizontalalignment(swingconstants.center);     lblx.setforeground(color.white);     contentpane.add(lblx);      labeltimer = new jlabel("0.0.0");     labeltimer.sethorizontalalignment(swingconstants.center);     labeltimer.setfont(new font("dinpro-bold", font.plain, 200));     labeltimer.setforeground(color.white);     labeltimer.setbounds(371, 134, 1418, 653);     contentpane.add(labeltimer);     setvisible(true); } 

this have timer code. have tried reset cal 0 in several different places not working.

private void starttimer() {     new thread()     {         public void run()         {             while(true)             {             calendar cal = new gregoriancalendar();             int minutes = cal.get(calendar.minute);             int seconds = cal.get(calendar.second);             int milliseconds = cal.get(calendar.millisecond);             labeltimer.settext(minutes + "." + seconds + "." + milliseconds);             }         }     }.start(); } 

}

in order able stop timer thread need have means of communicating between main thread , timer thread. synchronized member variable of rubixtimermain class can that:

private boolean isstopped = new boolean(true); 

then can add 2 methods. 1 stops timer setting variable, other 1 checks current state of variable.

private void stoptimer(){     synchronized(isstopped){         isstopped = true;     } }  private boolean istimerrunning(){     boolean result = false;     synchronized(isstopped){         result = !isstopped;     }     return result; } 

you want change listener event of space key (in createwindow) starts , stops timing:

addkeylistener(new keyadapter() {     @override     public void keyreleased(keyevent e) {         if (e.getkeycode() == keyevent.vk_space) {             if (istimerrunning()){                 stoptimer();             } else {                 starttimer();             }         }     } }); 

finally need adapt thread function runs if stopped state variable false. notice uses istimerrunning method instead of directly accessing variable. error of displaying wrong time fixed converting value of gregoriancalendar milliseconds first, subtracting recorded start time current time.

private void starttimer() {     new thread()     {         public void run()         {             long timestart = new gregoriancalendar().gettimeinmillis();             synchronized(isstopped){                 isstopped = false;             }              while(istimerrunning())             {                 long timenow = new gregoriancalendar().gettimeinmillis() - timestart;                 long milliseconds = (timenow % 1000);                 timenow = (long) math.floor(timenow * 0.001f);                 long seconds = (timenow % 60);                 timenow = (long)math.floor((float)timenow / 60f);                 long minutes = timenow;                  labeltimer.settext(minutes + "." + seconds + "." + milliseconds);             }         }     }.start(); } 

Comments

Popular posts from this blog

javascript - Thinglink image not visible until browser resize -

firebird - Error "invalid transaction handle (expecting explicit transaction start)" executing script from Delphi -

mongodb - How to keep track of users making Stripe Payments -