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
还有好多好多,我改了一下,你自己看看吧
字段命名不规范
若没有外部调用,字段最好声明为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写完嵌到网页上会好些!
好的开始是成功的一半,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 谢谢你哦! 呵呵,
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();
好象程序会出现 空指针异常```
你的程序写的真的很美观呀, 看起来就是那么舒服,我以后得多注意注意了`
这个方法我还没想到,呵呵,谢谢```
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??
过不了多少天你自己都不懂了
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
还有好多好多,我改了一下,你自己看看吧
字段命名不规范
若没有外部调用,字段最好声明为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写完嵌到网页上会好些!
好的开始是成功的一半,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 谢谢你哦! 呵呵,
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();
好象程序会出现 空指针异常```
你的程序写的真的很美观呀, 看起来就是那么舒服,我以后得多注意注意了`
这个方法我还没想到,呵呵,谢谢```
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??
过不了多少天你自己都不懂了
JFrame j;
JLabel jt = new JLabel();
JLabel jt1,jt2,jt3,jt4,jt5,jt6,jt7;
兄弟,要是你搞它几百个标签你就准备jt1一直到100??
过不了多少天你自己都不懂了
#10
支持。。。!!
#11
2楼的评论厉害。如果帖子都有这样的回复就好了
#12
二楼太帅气了,代码太有型了,赞一个!楼主加油,刚开始学都这样,GOGO!
#13
额 可以帮我写一个jsp的 用在拍卖网站上的倒计时吗?我写的倒计时只能运行一个,而且一刷新又从头开始了!谢谢了