怎么用Java实现精确到毫秒的倒计时器 现在要用Java实现一个倒计时器,我采用的办法是:先获得总的毫秒数matchTime,然后用Timer,每隔一毫秒就让matchTime减1,然后再把matchTime转换成时间的格式。但是这样做出来的时间走的比现实时间要慢得多,如果改成每100秒减100次,就和现实时间差不多了,这也就是说精确到了0.1秒。但是有没有办法精确到毫秒呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【yugang1219】截止到2008-07-28 13:46:32的历史汇总数据(不包括此帖):发帖的总数量:11 发帖的总分数:420 每贴平均分数:38 回帖的总数量:56 得分贴总数量:17 回帖的得分率:30% 结贴的总数量:8 结贴的总分数:310 无满意结贴数:0 无满意结贴分:0 未结的帖子数:3 未结的总分数:110 结贴的百分比:72.73 % 结分的百分比:73.81 % 无满意结贴率:0.00 % 无满意结分率:0.00 % 楼主加油 getMilliseconds(),返回毫秒数。 windows系统的计时精确度在15毫秒左右。 import java.util.Date;import java.io.PrintWriter;import java.io.StringWriter;import java.awt.Font;import java.awt.BorderLayout;import java.awt.event.MouseEvent;import java.awt.event.MouseAdapter;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.SwingConstants;/** * TimerFrame - 倒计时窗口 * @author SageZk * @version 1.0 */@SuppressWarnings("serial")public class TimerFrame extends JFrame { private long time = (long) (1.2 * 60 * 1000L); //倒计时时间(单位毫秒) private JLabel lblTime; private Thread runner; public TimerFrame() { super("TimerFrame"); this.lblTime = new JLabel("单击开始"); this.lblTime.setFont(new Font("Monospaced", Font.BOLD, 60)); this.lblTime.setHorizontalAlignment(SwingConstants.CENTER); this.lblTime.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (runner != null) runner.start(); } }); this.runner = new Thread(new Runnable() { public void run() { Date t = new Date(); StringWriter sw = new StringWriter(); StringBuffer sb = sw.getBuffer(); PrintWriter pw = new PrintWriter(sw); long cur = 0L, end = System.currentTimeMillis() + time; while ((cur = end - System.currentTimeMillis()) > 0) { t.setTime(cur); pw.format("%1$tM:%1$tS.%tL", t); pw.flush(); lblTime.setText(sb.toString()); sb.setLength(0); try { Thread.sleep(6L); } catch (InterruptedException e) { } } lblTime.setText("00:00.000"); try { Thread.sleep(1200L); } catch (InterruptedException e) { } lblTime.setText("Bomb!!!"); } }); this.runner.setDaemon(true); getContentPane().add(this.lblTime, BorderLayout.CENTER); setResizable(false); setBounds(0, 0, 460, 330); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new TimerFrame().setVisible(true); }} import java.util.Date;import java.io.PrintWriter;import java.awt.Font;import java.swing.JFrame; public TimerFrame() { super("TimerFrame"); this.lblTime = new JLabel("单击开始"); this.lblTime.setFont(new Font("Monospaced", Font.BOLD, 60)); this.lblTime.setHorizontalAlignment(SwingConstants.CENTER); this.lblTime.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent e) { if (runner != null) runner.start(); } });this.runner = new Thread(new Runnable() { public void run() { Date t = new Date(); StringWriter sw = new StringWriter(); StringBuffer sb = sw.getBuffer(); PrintWriter pw = new PrintWriter(sw); long cur = 0L, end = System.currentTimeMillis() + time; while ((cur = end - System.currentTimeMillis()) > 0) { t.setTime(cur); pw.format("%1$tM:%1$tS.%tL", t); pw.flush(); lblTime.setText(sb.toString()); sb.setLength(0); try { Thread.sleep(6L); } catch (InterruptedException e) { } } lblTime.setText("00:00.000"); try { Thread.sleep(1200L); } catch (InterruptedException e) { } lblTime.setText("Bomb!!!"); } }); this.runner.setDaemon(true); getContentPane().add(this.lblTime, BorderLayout.CENTER); setResizable(false); setBounds(0, 0, 460, 330); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { new TimerFrame().setVisible(true); }} 8楼的 Copy 我代码也不贴全,你那能通过编译吗? 用Timer 不就行了,quartz 也可以。 this.runner = new Thread(new Runnable() { public void run() { Date t = new Date(); StringWriter sw = new StringWriter(); StringBuffer sb = sw.getBuffer(); PrintWriter pw = new PrintWriter(sw); long cur = 0L, end = System.currentTimeMillis() + time; while ((cur = end - System.currentTimeMillis()) > 0) { t.setTime(cur); pw.format("%1$tM:%1$tS.%tL", t); pw.flush(); lblTime.setText(sb.toString()); sb.setLength(0); try { Thread.sleep(6L); } catch (InterruptedException e) { } } lblTime.setText("00:00.000"); try { Thread.sleep(1200L); } catch (InterruptedException e) { } lblTime.setText("Bomb!!!"); } }); this.runner.setDaemon(true); 估计毫秒级,应该不好实现。我的机器,所有线程轮一圈,大概10毫秒。所以,一旦程序中出现sleep,那么下次执行的毫秒数很有可能会滞后(每次最多10毫秒)。JDK1.5当中的Timer类。楼主可以去看看。如果应用简单的话。应该能够达到要求。 JDK 7 使用ireport打印字间距小 java 基础问题 关于byte java的问题 关于api的一些问题 数组怎样随机排序,并把所有情况显示出来--- 急求高手指点 这个TextField的显示为什么总是不完全? 请问如何遍历一个目录下的所有文件? 在线等待:怎么会调用方法accept()呢? 各位大虾,求救,给分 Java面试题-StringBuilder和StringBuffer的区别 谁能给出工厂模式的UML图?谢谢
楼主【yugang1219】截止到2008-07-28 13:46:32的历史汇总数据(不包括此帖):
发帖的总数量:11 发帖的总分数:420 每贴平均分数:38
回帖的总数量:56 得分贴总数量:17 回帖的得分率:30%
结贴的总数量:8 结贴的总分数:310
无满意结贴数:0 无满意结贴分:0
未结的帖子数:3 未结的总分数:110
结贴的百分比:72.73 % 结分的百分比:73.81 %
无满意结贴率:0.00 % 无满意结分率:0.00 %
楼主加油
import java.io.PrintWriter;
import java.io.StringWriter;
import java.awt.Font;
import java.awt.BorderLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;/**
* TimerFrame - 倒计时窗口
* @author SageZk
* @version 1.0
*/
@SuppressWarnings("serial")
public class TimerFrame extends JFrame { private long time = (long) (1.2 * 60 * 1000L); //倒计时时间(单位毫秒)
private JLabel lblTime;
private Thread runner; public TimerFrame() {
super("TimerFrame");
this.lblTime = new JLabel("单击开始");
this.lblTime.setFont(new Font("Monospaced", Font.BOLD, 60));
this.lblTime.setHorizontalAlignment(SwingConstants.CENTER);
this.lblTime.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (runner != null) runner.start();
}
});
this.runner = new Thread(new Runnable() {
public void run() {
Date t = new Date();
StringWriter sw = new StringWriter();
StringBuffer sb = sw.getBuffer();
PrintWriter pw = new PrintWriter(sw);
long cur = 0L, end = System.currentTimeMillis() + time;
while ((cur = end - System.currentTimeMillis()) > 0) {
t.setTime(cur);
pw.format("%1$tM:%1$tS.%tL", t);
pw.flush();
lblTime.setText(sb.toString());
sb.setLength(0);
try {
Thread.sleep(6L);
} catch (InterruptedException e) {
}
}
lblTime.setText("00:00.000");
try {
Thread.sleep(1200L);
} catch (InterruptedException e) {
}
lblTime.setText("Bomb!!!");
}
});
this.runner.setDaemon(true);
getContentPane().add(this.lblTime, BorderLayout.CENTER);
setResizable(false);
setBounds(0, 0, 460, 330);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public static void main(String[] args) {
new TimerFrame().setVisible(true);
}}
import java.io.PrintWriter;
import java.awt.Font;
import java.swing.JFrame;
public TimerFrame() {
super("TimerFrame");
this.lblTime = new JLabel("单击开始");
this.lblTime.setFont(new Font("Monospaced", Font.BOLD, 60));
this.lblTime.setHorizontalAlignment(SwingConstants.CENTER);
this.lblTime.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (runner != null) runner.start();
}
});
this.runner = new Thread(new Runnable() {
public void run() {
Date t = new Date();
StringWriter sw = new StringWriter();
StringBuffer sb = sw.getBuffer();
PrintWriter pw = new PrintWriter(sw);
long cur = 0L, end = System.currentTimeMillis() + time;
while ((cur = end - System.currentTimeMillis()) > 0) {
t.setTime(cur);
pw.format("%1$tM:%1$tS.%tL", t);
pw.flush();
lblTime.setText(sb.toString());
sb.setLength(0);
try {
Thread.sleep(6L);
} catch (InterruptedException e) {
}
}
lblTime.setText("00:00.000");
try {
Thread.sleep(1200L);
} catch (InterruptedException e) {
}
lblTime.setText("Bomb!!!");
}
});
this.runner.setDaemon(true);
getContentPane().add(this.lblTime, BorderLayout.CENTER);
setResizable(false);
setBounds(0, 0, 460, 330);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} public static void main(String[] args) {
new TimerFrame().setVisible(true);
}}
public void run() {
Date t = new Date();
StringWriter sw = new StringWriter();
StringBuffer sb = sw.getBuffer();
PrintWriter pw = new PrintWriter(sw);
long cur = 0L, end = System.currentTimeMillis() + time;
while ((cur = end - System.currentTimeMillis()) > 0) {
t.setTime(cur);
pw.format("%1$tM:%1$tS.%tL", t);
pw.flush();
lblTime.setText(sb.toString());
sb.setLength(0);
try {
Thread.sleep(6L);
} catch (InterruptedException e) {
}
}
lblTime.setText("00:00.000");
try {
Thread.sleep(1200L);
} catch (InterruptedException e) {
}
lblTime.setText("Bomb!!!");
}
});
this.runner.setDaemon(true);
所以,一旦程序中出现sleep,那么下次执行的毫秒数很有可能会滞后(每次最多10毫秒)。JDK1.5当中的Timer类。楼主可以去看看。如果应用简单的话。应该能够达到要求。