写了一个JAVA倒计时程序,和大家交流下。

时间:2022-06-08 22:02:11
import java.awt.Container;
import java.awt.FlowLayout;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class TimeTest2 extends JFrame implements Runnable{
    JFrame j;
    JLabel jt = new JLabel();
    JLabel jt1,jt2,jt3,jt4,jt5,jt6,jt7;
    Thread clocker,cl;
    JButton b2;
    Container c;
    String ss;
    long m;
    public TimeTest2(){
     j = new JFrame();
     c =j.getContentPane();
     j.setLayout(new FlowLayout()); 
     jt1 = new JLabel("当前时间为:");
     jt2 = new JLabel("离考试结束还有:");
     jt3 = new JLabel();
     jt4 = new JLabel("秒");
     jt5 = new JLabel("离考试结束还有:");
     jt6 = new JLabel("");
     jt7 = new JLabel("分钟");
     jt3 = new JLabel();
     j.add(jt1);j.add(jt);
     j.add(jt2);j.add(jt3);j.add(jt4);
     j.add(jt5);j.add(jt6);j.add(jt7);
     jt3.setVisible(false);
     jt6.setVisible(false);
     j.setResizable(false);
     j.setSize(200,150);
     j.setLocation(350, 250);
     j.setVisible(true);
     j.setDefaultCloseOperation(EXIT_ON_CLOSE);
     clocker=new Thread(this);
cl=new Thread(this);
clocker.start();

j.setLocation(830, 580);
Calendar rg = Calendar.getInstance();
rg.setTime(new java.util.Date());
m =rg.getTime().getTime(); //获得开始时候的那个时间点
    }
   
    
public void run(){
while(true){    
SimpleDateFormat df =new SimpleDateFormat("hh:mm:ss");
Calendar rightNow = Calendar.getInstance();
        rightNow.setTime(new java.util.Date());
        long l1 = rightNow.getTime().getTime () ;         
    long l2 = m + 2*60*60*1000; // 从开始时刻开始 加两个小时 
        long mm= l2-l1;
        long s = mm/(1000);
        long min =mm/(60*1000);
        String ss =String.valueOf(s); 
        String mi =String.valueOf(min); 
        jt3.setText(ss);
        jt6.setText(mi);
jt.setText(df.format(new java.util.Date())); 
try{
Thread.sleep(1);
}catch(InterruptedException e){}
j.setLocation(830, 580);
jt3.setVisible(true);
jt6.setVisible(true);
if( min==118 ){
JOptionPane.showMessageDialog( null,"对不起!答题时间已到!", "提示", JOptionPane.OK_CANCEL_OPTION);
}
}
}
public static void main(String[] args) {
new TimeTest2();
}
}

我刚刚学java 
昨天写了个倒计时的程序
 拿出来看下,
还有没有其他的写法  
交流下`


   还有对我写程序的风格有什么地方需要改的也说说`
谢谢

13 个解决方案

#1


先说编程风格哈

字段命名不规范

若没有外部调用,字段最好声明为private

import时最好不要用*

为什么jt1, jt2, jt3, jt4, jt5, jt6, jt7放在一行声明,而jt却要单独占一行呢,统一一下岂不是更好


再说代码内容哈

既然是extends JFrame,为什么又要new JFrame()呢
不要在构造方法里放太多的东东
Thread cl、JButton b2、String ss、Container c都没有用到,还留着干嘛

this.setLocation(350, 250);this.setLocation(830, 580); 构造方法里出现了这两行,估计是笔误吧

方法里面最好不要用包名,比如rg.setTime(new java.util.Date());

Calendar rg = Calendar.getInstance();
rg.setTime(new Date());
m = rg.getTime().getTime(); // 获得开始时候的那个时间点
这些与线程有关的都放到run里面去吧

秒和分钟的那两个标签完全可以省掉呀,把字写在时间后面不就行了

lbLeaveSec.setVisible(false);
lbLeaveMin.setVisible(false);
这两行完全没有必要的


this.setLocation(830, 580);不知道你在线程中为什么还要写这一行
SimpleDateFormat df = new SimpleDateFormat("hh:mm:ss");写在循环外面岂不是更好
rg.setTime(new Date());完成没有必要,Calendar.getInstance()获取的就是当前时间

异常信息最好打印出来,e.printStackTrace();

Thread.sleep(1);这个也太小了吧,1000够了

JOptionPane.showMessageDialog(this, "对不起!答题时间已到!", "提示", JOptionPane.OK_OPTION);  这一行这么写岂不是更好

答题时间到的时候最好break


还有好多好多,我改了一下,你自己看看吧



import java.awt.FlowLayout;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class TimeCount extends JFrame implements Runnable
{
    private static final long serialVersionUID = 3484639121843864203L;

    private JLabel lbNow, lbNowTitle, lbLeftSecTitle, lbLeftSec, lbLeftMinTitle, lbLeftMin;

    private Thread clocker;

    public TimeCount()
    {
        this.setLayout(new FlowLayout());
        this.setResizable(false);
        this.setSize(200, 150);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocation(830, 580);
        initUI();
        clocker = new Thread(this);
        clocker.start();
    }

    private void initUI()
    {
        lbNowTitle = new JLabel("当前时间为:");
        lbNow = new JLabel();
        lbLeftSecTitle = new JLabel("离考试结束还有:");
        lbLeftSec = new JLabel();
        lbLeftMinTitle = new JLabel("离考试结束还有:");
        lbLeftMin = new JLabel("");
        
        this.add(lbNowTitle);
        this.add(lbNow);
        this.add(lbLeftSecTitle);
        this.add(lbLeftSec);
        this.add(lbLeftMinTitle);
        this.add(lbLeftMin);
    }

    public void run()
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm:ss");
        Calendar startCalendar = Calendar.getInstance();
        long startTime = startCalendar.getTime().getTime(); // 获得开始时候的那个时间点
        long endTime = startTime + 2 * 60 * 60 * 1000; // 从开始时刻开始 加两个小时
        long nowTime, leftTime, leftSec, leftMin;
        Calendar now;
        
        while(true)
        {
            now = Calendar.getInstance();
            nowTime = now.getTime().getTime();
            leftTime = endTime - nowTime;
            leftSec = leftTime / 1000;
            leftMin = leftTime / (60 * 1000);
            
            lbNow.setText(dateFormat.format(now.getTime()));
            lbLeftSec.setText(leftSec + " 秒");    //若后面不加字符,可以lbLeftSec.setText(leftSec + ""); 不用String.valueOf
            lbLeftMin.setText(leftMin + " 分钟");
            
            if(leftSec == 0)
            {
                JOptionPane.showMessageDialog(this, "对不起!答题时间已到!", "提示", JOptionPane.OK_OPTION);
                break;
            }
            
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        new TimeCount();
    }
}

#2


哈哈,评价的很有道理。
我也写过类似的手机版本的倒计时。

#3


我以前也写过一个,但是不是倒计时,是一个计时器,用Timer + TimeTask + SWT 

#4


哈哈~
好的开始是成功的一半,GUI的应用确实少写,用js写完嵌到网页上会好些!

#5


若没有外部调用,字段最好声明为private 

import时最好不要用* 

为什么jt1, jt2, jt3, jt4, jt5, jt6, jt7放在一行声明,而jt却要单独占一行呢,统一一下岂不是更好 

意见宝贵呀,以后会多多注意滴, 呵呵!


this.setLocation(350, 250);this.setLocation(830, 580); 构造方法里出现了这两行,估计是笔误吧


this.setLocation(830, 580);  这句是笔误,多写了``` 呵呵


Calendar rg = Calendar.getInstance(); 
rg.setTime(new Date()); 
m = rg.getTime().getTime(); // 获得开始时候的那个时间点 
这些与线程有关的都放到run里面去吧 


 这个不能放到线程里 这个如果放到线程里,那么我获得的那个开始点就会不断的刷新,那样的话,时间间隔就是一定的了
这个我测试过了 `不行


Thread.sleep(1);这个也太小了吧,1000够了 
用 1000的话 有个地方不太雅观,如果用1 线程执行的太快,那里就会马上跳过去,肉眼就看不出来了,我测试过了,你可以调成1000后试下试下看``


craky  谢谢你哦! 呵呵,

#6


秒和分钟的那两个标签完全可以省掉呀,把字写在时间后面不就行了


这个方法我还没想到,呵呵,谢谢```


this.setLocation(830, 580);不知道你在线程中为什么还要写这一行 

写这一行,会出现一个效果,就是程序一执行,窗口就会由桌面的(350, 250)跳到桌面的右下脚坐标(830, 580)去,并且通过线程功能,不断刷新这个方法使窗口固定在右下脚!

rg.setTime(new Date());完成没有必要,

测试了一下 好象真不需要。

既然是extends JFrame,为什么又要new JFrame()呢 

这个不NEW 下面有句 c =j.getContentPane();
好象程序会出现 空指针异常```



 你的程序写的真的很美观呀, 看起来就是那么舒服,我以后得多注意注意了`

#7


2楼的确很牛

#8


呵呵,大家太客气了吧~~~~~~~~~~

#9


我看了开头就开始晕了,
    JFrame j; 
    JLabel jt = new JLabel(); 
    JLabel jt1,jt2,jt3,jt4,jt5,jt6,jt7; 

兄弟,要是你搞它几百个标签你就准备jt1一直到100??

过不了多少天你自己都不懂了

#10


支持。。。!!

#11


2楼的评论厉害。如果帖子都有这样的回复就好了

#12


二楼太帅气了,代码太有型了,赞一个!楼主加油,刚开始学都这样,GOGO!

#13


额 可以帮我写一个jsp的  用在拍卖网站上的倒计时吗?我写的倒计时只能运行一个,而且一刷新又从头开始了!谢谢了

#1


先说编程风格哈

字段命名不规范

若没有外部调用,字段最好声明为private

import时最好不要用*

为什么jt1, jt2, jt3, jt4, jt5, jt6, jt7放在一行声明,而jt却要单独占一行呢,统一一下岂不是更好


再说代码内容哈

既然是extends JFrame,为什么又要new JFrame()呢
不要在构造方法里放太多的东东
Thread cl、JButton b2、String ss、Container c都没有用到,还留着干嘛

this.setLocation(350, 250);this.setLocation(830, 580); 构造方法里出现了这两行,估计是笔误吧

方法里面最好不要用包名,比如rg.setTime(new java.util.Date());

Calendar rg = Calendar.getInstance();
rg.setTime(new Date());
m = rg.getTime().getTime(); // 获得开始时候的那个时间点
这些与线程有关的都放到run里面去吧

秒和分钟的那两个标签完全可以省掉呀,把字写在时间后面不就行了

lbLeaveSec.setVisible(false);
lbLeaveMin.setVisible(false);
这两行完全没有必要的


this.setLocation(830, 580);不知道你在线程中为什么还要写这一行
SimpleDateFormat df = new SimpleDateFormat("hh:mm:ss");写在循环外面岂不是更好
rg.setTime(new Date());完成没有必要,Calendar.getInstance()获取的就是当前时间

异常信息最好打印出来,e.printStackTrace();

Thread.sleep(1);这个也太小了吧,1000够了

JOptionPane.showMessageDialog(this, "对不起!答题时间已到!", "提示", JOptionPane.OK_OPTION);  这一行这么写岂不是更好

答题时间到的时候最好break


还有好多好多,我改了一下,你自己看看吧



import java.awt.FlowLayout;
import java.text.SimpleDateFormat;
import java.util.Calendar;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class TimeCount extends JFrame implements Runnable
{
    private static final long serialVersionUID = 3484639121843864203L;

    private JLabel lbNow, lbNowTitle, lbLeftSecTitle, lbLeftSec, lbLeftMinTitle, lbLeftMin;

    private Thread clocker;

    public TimeCount()
    {
        this.setLayout(new FlowLayout());
        this.setResizable(false);
        this.setSize(200, 150);
        this.setVisible(true);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setLocation(830, 580);
        initUI();
        clocker = new Thread(this);
        clocker.start();
    }

    private void initUI()
    {
        lbNowTitle = new JLabel("当前时间为:");
        lbNow = new JLabel();
        lbLeftSecTitle = new JLabel("离考试结束还有:");
        lbLeftSec = new JLabel();
        lbLeftMinTitle = new JLabel("离考试结束还有:");
        lbLeftMin = new JLabel("");
        
        this.add(lbNowTitle);
        this.add(lbNow);
        this.add(lbLeftSecTitle);
        this.add(lbLeftSec);
        this.add(lbLeftMinTitle);
        this.add(lbLeftMin);
    }

    public void run()
    {
        SimpleDateFormat dateFormat = new SimpleDateFormat("hh:mm:ss");
        Calendar startCalendar = Calendar.getInstance();
        long startTime = startCalendar.getTime().getTime(); // 获得开始时候的那个时间点
        long endTime = startTime + 2 * 60 * 60 * 1000; // 从开始时刻开始 加两个小时
        long nowTime, leftTime, leftSec, leftMin;
        Calendar now;
        
        while(true)
        {
            now = Calendar.getInstance();
            nowTime = now.getTime().getTime();
            leftTime = endTime - nowTime;
            leftSec = leftTime / 1000;
            leftMin = leftTime / (60 * 1000);
            
            lbNow.setText(dateFormat.format(now.getTime()));
            lbLeftSec.setText(leftSec + " 秒");    //若后面不加字符,可以lbLeftSec.setText(leftSec + ""); 不用String.valueOf
            lbLeftMin.setText(leftMin + " 分钟");
            
            if(leftSec == 0)
            {
                JOptionPane.showMessageDialog(this, "对不起!答题时间已到!", "提示", JOptionPane.OK_OPTION);
                break;
            }
            
            try
            {
                Thread.sleep(1000);
            }
            catch(InterruptedException e)
            {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args)
    {
        new TimeCount();
    }
}

#2


哈哈,评价的很有道理。
我也写过类似的手机版本的倒计时。

#3


我以前也写过一个,但是不是倒计时,是一个计时器,用Timer + TimeTask + SWT 

#4


哈哈~
好的开始是成功的一半,GUI的应用确实少写,用js写完嵌到网页上会好些!

#5


若没有外部调用,字段最好声明为private 

import时最好不要用* 

为什么jt1, jt2, jt3, jt4, jt5, jt6, jt7放在一行声明,而jt却要单独占一行呢,统一一下岂不是更好 

意见宝贵呀,以后会多多注意滴, 呵呵!


this.setLocation(350, 250);this.setLocation(830, 580); 构造方法里出现了这两行,估计是笔误吧


this.setLocation(830, 580);  这句是笔误,多写了``` 呵呵


Calendar rg = Calendar.getInstance(); 
rg.setTime(new Date()); 
m = rg.getTime().getTime(); // 获得开始时候的那个时间点 
这些与线程有关的都放到run里面去吧 


 这个不能放到线程里 这个如果放到线程里,那么我获得的那个开始点就会不断的刷新,那样的话,时间间隔就是一定的了
这个我测试过了 `不行


Thread.sleep(1);这个也太小了吧,1000够了 
用 1000的话 有个地方不太雅观,如果用1 线程执行的太快,那里就会马上跳过去,肉眼就看不出来了,我测试过了,你可以调成1000后试下试下看``


craky  谢谢你哦! 呵呵,

#6


秒和分钟的那两个标签完全可以省掉呀,把字写在时间后面不就行了


这个方法我还没想到,呵呵,谢谢```


this.setLocation(830, 580);不知道你在线程中为什么还要写这一行 

写这一行,会出现一个效果,就是程序一执行,窗口就会由桌面的(350, 250)跳到桌面的右下脚坐标(830, 580)去,并且通过线程功能,不断刷新这个方法使窗口固定在右下脚!

rg.setTime(new Date());完成没有必要,

测试了一下 好象真不需要。

既然是extends JFrame,为什么又要new JFrame()呢 

这个不NEW 下面有句 c =j.getContentPane();
好象程序会出现 空指针异常```



 你的程序写的真的很美观呀, 看起来就是那么舒服,我以后得多注意注意了`

#7


2楼的确很牛

#8


呵呵,大家太客气了吧~~~~~~~~~~

#9


我看了开头就开始晕了,
    JFrame j; 
    JLabel jt = new JLabel(); 
    JLabel jt1,jt2,jt3,jt4,jt5,jt6,jt7; 

兄弟,要是你搞它几百个标签你就准备jt1一直到100??

过不了多少天你自己都不懂了

#10


支持。。。!!

#11


2楼的评论厉害。如果帖子都有这样的回复就好了

#12


二楼太帅气了,代码太有型了,赞一个!楼主加油,刚开始学都这样,GOGO!

#13


额 可以帮我写一个jsp的  用在拍卖网站上的倒计时吗?我写的倒计时只能运行一个,而且一刷新又从头开始了!谢谢了