一、实验内容
编程实现简单的数字时钟,能显示日期和时间(时、分、秒)如下图所示。
二、设计分析
一共需要设计3个类
- 1、实现线程接口Runnable+具体实现抽象方法run()的子类NumberClockThread
- 2、设计JFrame窗体NumClock
- 3、NumClockTest测试类开启线程执行
三、代码演示
1、实现线程接口Runnable+具体实现抽象方法run()的子类NumberClockThread类
package exam1;
import java.util.Calendar;
import static java.util.Calendar.HOUR_OF_DAY;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* 注意设计run方法:使用日期类Calendar来获取系统当前时间 时间是int类型,窗口控件是string类型,所以int要转换为string:
* String.valueOf()
*/
public class NumberClockThread implements Runnable {
private String year;
private String month;
private String day;
private String hour;
private String minute;
private String second;
public static NumClock NC = null;//UI窗口界面空对象
public NumberClockThread() {//生成对象时也实例化一个窗口界面类
NC = new NumClock();//UI界面对象
NC.setVisible(true);//界面显示出来
}
@Override
public void run() {//只有线程Thread调用start()时才运行这段代码
while (true) {
Calendar now = new GregorianCalendar();//日历类:Calendar是抽象类,GregorianCalendar是子类
year = String.valueOf(now.get(Calendar.YEAR));
month = String.valueOf(now.get(Calendar.MONTH) + 1);//该Calendar里面的month是0开始的
day = String.valueOf(now.get(Calendar.DATE));
hour = String.valueOf(now.get(Calendar.HOUR_OF_DAY));
minute = String.valueOf(now.get(Calendar.MINUTE));
second = String.valueOf(now.get(Calendar.SECOND));
NC.SendTime(year, month, day, hour, minute, second);
//把时间数据发送到窗体对象-并调用setTime()显示到控件上-结束-回到此处-继续循环-实现界面数据的动态更新
try {
Thread.sleep(1000);//休息1秒,再来获取时间日期更新并同时GUI界面更新获取数据显示
} catch (InterruptedException ex) {
Logger.getLogger(NumberClockThread.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
2、设计JFrame窗体NumClock类
package exam1;
/**
* 注意设计两个方法:SendTime()、SetTime() 因为实现接口Runnable的子类构造函数已经实例化了窗口对象
* 所以可调用方法SendTime()把run方法中的日期传回对象中 此时窗口对象有了数据就可以SetTime()显示setText到控件上去了
*/
public class NumClock extends javax.swing.JFrame {
private String year;
private String month;
private String day;
private String hour;
private String minute;
private String second;
public void SendTime(String y, String m, String d, String h, String minutes, String s) {
//该函数使用线程Thread,放在构造函数中
year = y;
month = m;
day = d;
hour = h;
minute = minutes;
second = s;
SetTime();
}
public void SetTime() {
JTextYear.setText(year);
JTextMonth.setText(month);
JTextDay.setText(day);
JTextHour.setText(hour);
JTextMinute.setText(minute);
JTextSecond.setText(second);
}
public NumClock() {//构造函数
initComponents();
}
//此处省略了自动生成的代码部分
private javax.swing.JTextField JTextDay;
private javax.swing.JTextField JTextHour;
private javax.swing.JTextField JTextMinute;
private javax.swing.JTextField JTextMonth;
private javax.swing.JTextField JTextSecond;
private javax.swing.JTextField JTextYear;
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
}
3、NumClockTest测试类开启线程执行
package SyTest;
import exam1.NumClock;
import exam1.NumberClockThread;
/**
* 设计思想:以一个窗口一个对象一个界面的思想来设计数字时钟 测试类负责创建开启线程 线程start运行的run方法里面具体实现:
* run方法:首先创建一个静态窗口空对象 接着,在实现接口Runnable的子类构造方法里面new开辟窗口对象并显示setVisible
* 目前为止窗体界面已经创建成功,接下来就是把日期显示到窗口文本控件中去 因为日期是动态获取的,所以也要动态的把日期发送到窗口对象中并更新显示到控件
*/
public class NumClockTest {
public static void main(String[] args) {
NumberClockThread ncTh = new NumberClockThread();
Thread th = new Thread(ncTh);
th.start();//开启线程,也就是开始运行run()方法
}
}
四、运行截图