这是一个用于
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;
- }
- }