模拟一个电子时钟,它可以在任何时候被启动或者停止,并可以独立的运行。
1.定义一个Clock类。它继承Label类,并实现Runnable接口。这个类中有一个Thread类型的clocker域,以及start()和run()方法。在run()方法中,每隔一秒就把系统时间显示为label的文本。
1 class Clock extends Label implements Runnable 2 { 3 //定义Thread类型的clocker域 4 public Thread clocker=null; 5 public Clock() 6 { 7 8 //初始化时,把label设置为当前系统时间 9 //调用toString方法转化为String类型10 setText(new Date().toString());11 }12 //控制线程的启动13 public void start()14 {15 if(clocker==null)16 {17 //clocker通过Thread类构造方法得到的对象进行初始化,并将Clock类的当前对象作为参数18 clocker=new Thread(this);19 clocker.start();20 }21 22 }23 //控制线程的停止24 public void stop()25 {26 clocker=null;27 }28 //实现Runnable接口中的run()方法29 public void run()30 {31 Thread currentThread=Thread.currentThread();32 //判断clocker是否是当前运行的线程33 while(clocker==currentThread)34 {35 setText(new Date().toString());36 try37 { //休眠1s钟38 clocker.sleep(1000);39 }40 catch (InterruptedException ie)41 {42 System.out.println("Thread error:"+ie);43 }44 }45 46 }47 48 }
2.定义一个ClockFrame类。它继承Frame类,并实现ActionListener接口。在这个类中定义start和stop按钮来控制电子时钟的运行。并且这个类有一个Clock类的域,把这个Clock类对象添加到ClockFrame类中显示。
1 public class ClockFrame extends Frame implements ActionListener 2 { 3 private Button start=new Button("Start"); 4 private Button stop=new Button("Stop"); 5 private Clock c=new Clock(); 6 public ClockFrame() 7 { 8 super("电子时钟"); 9 //设置窗体使用流式布局10 setLayout(new FlowLayout());11 //添加按钮并且为其注册监听器12 add(start);13 start.addActionListener(this);14 add(stop);15 stop.addActionListener(this);16 //使用继承WindowAdapter的匿名内部类来实现窗口的关闭17 addWindowListener(new WindowAdapter()18 {19 public void windowClosing(WindowEvent we)20 {System.exit(0);}21 });22 add(c);23 //使构件在窗口中得到合理的安排。24 pack();25 setVisible(true);26 27 28 }29 //通过调用Clock对象中的方法,实现对事件的响应。30 public void actionPerformed(ActionEvent ae)31 {32 if(ae.getSource()==start)33 {34 c.start();35 }36 else37 if(ae.getSource()==stop)38 c.stop();39 40 }41 public static void main(String[] args)42 {43 new ClockFrame();44 }45 }
3、运行:
注:
需要导入的类:
import java.awt.*;import java.awt.event.*;import java.util.Date;