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 
昨天写了个倒计时的程序
 拿出来看下,
还有没有其他的写法  
交流下`
   还有对我写程序的风格有什么地方需要改的也说说`
谢谢

解决方案 »

  1.   

    先说编程风格哈字段命名不规范若没有外部调用,字段最好声明为privateimport时最好不要用*为什么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.   

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

  3.   

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

  4.   

    若没有外部调用,字段最好声明为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  谢谢你哦! 呵呵,
      

  5.   

    秒和分钟的那两个标签完全可以省掉呀,把字写在时间后面不就行了
    这个方法我还没想到,呵呵,谢谢```
    this.setLocation(830, 580);不知道你在线程中为什么还要写这一行 写这一行,会出现一个效果,就是程序一执行,窗口就会由桌面的(350, 250)跳到桌面的右下脚坐标(830, 580)去,并且通过线程功能,不断刷新这个方法使窗口固定在右下脚!rg.setTime(new Date());完成没有必要,测试了一下 好象真不需要。既然是extends JFrame,为什么又要new JFrame()呢 这个不NEW 下面有句 c =j.getContentPane();
    好象程序会出现 空指针异常``` 你的程序写的真的很美观呀, 看起来就是那么舒服,我以后得多注意注意了`
      

  6.   

    我看了开头就开始晕了,
        JFrame j; 
        JLabel jt = new JLabel(); 
        JLabel jt1,jt2,jt3,jt4,jt5,jt6,jt7; 兄弟,要是你搞它几百个标签你就准备jt1一直到100??过不了多少天你自己都不懂了
      

  7.   

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

  8.   

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