现在要用Java实现一个倒计时器,我采用的办法是:先获得总的毫秒数matchTime,然后用Timer,每隔一毫秒就让matchTime减1,然后再把matchTime转换成时间的格式。但是这样做出来的时间走的比现实时间要慢得多,如果改成每100秒减100次,就和现实时间差不多了,这也就是说精确到了0.1秒。但是有没有办法精确到毫秒呢?

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【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  %                  
    楼主加油
      

  2.   

    getMilliseconds(),返回毫秒数。
      

  3.   

    windows系统的计时精确度在15毫秒左右。
      

  4.   

    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);
    }}
      

  5.   

    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);
        }}
      

  6.   

    8楼的 Copy 我代码也不贴全,你那能通过编译吗?
      

  7.   

    用Timer 不就行了,quartz 也可以。
      

  8.   

    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); 
      

  9.   

    估计毫秒级,应该不好实现。我的机器,所有线程轮一圈,大概10毫秒。
    所以,一旦程序中出现sleep,那么下次执行的毫秒数很有可能会滞后(每次最多10毫秒)。JDK1.5当中的Timer类。楼主可以去看看。如果应用简单的话。应该能够达到要求。