这是一个用于
JavaFX的简单秒表的类,根据需要设置Label对象的样式
package aaa; import java.text.SimpleDateFormat; import java.util.Date; import javafx.beans.property.SimpleStringProperty; /** * * @author D07114915 */ public class KTimer extends Thread { private Thread thread = null; private SimpleDateFormat sdf = new SimpleDateFormat("mm:ss:S"); private String[] split; private SimpleStringProperty min,sec,millis,sspTime; private long time; public static void main(String[] args) { KTimer t = new KTimer(); t.startTimer(00); } public KTimer() { min = new SimpleStringProperty("00"); sec = new SimpleStringProperty("00"); millis = new SimpleStringProperty("00"); sspTime = new SimpleStringProperty("00:00:00"); } public void startTimer(long time) { this.time = time; thread = new Thread(this); thread.setPriority(Thread.MIN_PRIORITY); thread.start(); } public void stopTimer(long time) { if (thread != null) { thread.interrupt(); } this.time = time; setTime(time); } public void setTime(long time) { this.time = time; split = sdf.format(new Date(time)).split(":"); min.set(split[0]); sec.set(split[1]); if (split[2].length() == 1) { split[2] = "0" + split[2]; } millis.set(split[2].substring(0,2)); sspTime.set(min.get() + ":" + sec.get() + ":" + millis.get()); } public long getTime() { return time; } public SimpleStringProperty getSspTime() { return sspTime; } @Override public void run() { try { while (!thread.isInterrupted()) { setTime(time); sleep(10); time = time + 10; } } catch (Exception e) { } } }//end of class
添加变量
KTimer ktimer; Label timeLabel;
在你的班级初始化变量
//Clock ktimer = new KTimer(); timeLabel = new Label(ktimer.getSspTime().get()); ktimer.getSspTime().addListener(new InvalidationListener() { @Override public void invalidated(Observable observable) { timeLabel.setText(ktimer.getSspTime().get()); } });
停止并重置是
ktimer.stopTimer(0);
启动和暂停计时器是
ktimer.startTimer(ktimer.getTime());
解决方法
这是一个略有不同的版本(可能更好),我不确定同步方法是否真的有必要
package aaa; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import java.util.TimerTask; import javafx.beans.property.SimpleStringProperty; /** * * @author D07114915 */ public class KTimer { private SimpleDateFormat sdf = new SimpleDateFormat("mm:ss:S"); private String[] split; private SimpleStringProperty sspTime; private long time; private Timer t = new Timer("Metronome",true); private TimerTask tt; boolean timing = false; public KTimer() { sspTime = new SimpleStringProperty("00:00:00"); } public void startTimer(final long time) { this.time = time; timing = true; tt = new TimerTask() { @Override public void run() { if (!timing) { try { tt.cancel(); } catch (Exception e) { e.printStackTrace(); } } else { updateTime(); } } }; t.scheduleAtFixedRate(tt,10,10); } public synchronized void stopTimer() { timing = false; } public synchronized void updateTime() { this.time = this.time + 10; split = sdf.format(new Date(this.time)).split(":"); sspTime.set(split[0] + ":" + split[1] + ":" + (split[2].length() == 1 ? "0" + split[2] : split[2].substring(0,2))); } public synchronized void moveToTime(long time) { stopTimer(); this.time = time; split = sdf.format(new Date(time)).split(":"); sspTime.set(split[0] + ":" + split[1] + ":" + (split[2].length() == 1 ? "0" + split[2] : split[2].substring(0,2))); } public synchronized long getTime() { return time; } public synchronized SimpleStringProperty getSspTime() { return sspTime; } }