java多线程编程制作电子时钟
程序员文章站
2024-03-07 08:40:50
模拟一个电子时钟,它可以在任何时候被启动或者停止,并可以独立的运行。
1.定义一个clock类。它继承label类,并实现runnable接口。这个类中有一...
模拟一个电子时钟,它可以在任何时候被启动或者停止,并可以独立的运行。
1.定义一个clock类。它继承label类,并实现runnable接口。这个类中有一个thread类型的clocker域,以及start()和run()方法。在run()方法中,每隔一秒就把系统时间显示为label的文本。
class clock extends label implements runnable { //定义thread类型的clocker域 public thread clocker=null; public clock() { //初始化时,把label设置为当前系统时间 //调用tostring方法转化为string类型 settext(new date().tostring()); } //控制线程的启动 public void start() { if(clocker==null) { //clocker通过thread类构造方法得到的对象进行初始化,并将clock类的当前对象作为参数 clocker=new thread(this); clocker.start(); } } //控制线程的停止 public void stop() { clocker=null; } //实现runnable接口中的run()方法 public void run() { thread currentthread=thread.currentthread(); //判断clocker是否是当前运行的线程 while(clocker==currentthread) { settext(new date().tostring()); try { //休眠1s钟 clocker.sleep(1000); } catch (interruptedexception ie) { system.out.println("thread error:"+ie); } } } }
2.定义一个clockframe类。它继承frame类,并实现actionlistener接口。在这个类中定义start和stop按钮来控制电子时钟的运行。并且这个类有一个clock类的域,把这个clock类对象添加到clockframe类中显示。
public class clockframe extends frame implements actionlistener { private button start=new button("start"); private button stop=new button("stop"); private clock c=new clock(); public clockframe() { super("电子时钟"); //设置窗体使用流式布局 setlayout(new flowlayout()); //添加按钮并且为其注册监听器 add(start); start.addactionlistener(this); add(stop); stop.addactionlistener(this); //使用继承windowadapter的匿名内部类来实现窗口的关闭 addwindowlistener(new windowadapter() { public void windowclosing(windowevent we) {system.exit(0);} }); add(c); //使构件在窗口中得到合理的安排。 pack(); setvisible(true); } //通过调用clock对象中的方法,实现对事件的响应。 public void actionperformed(actionevent ae) { if(ae.getsource()==start) { c.start(); } else if(ae.getsource()==stop) c.stop(); } public static void main(string[] args) { new clockframe(); } }
3、运行:
注:
需要导入的类:
import java.awt.*; import java.awt.event.*; import java.util.date;
再给大家一个网友的做法,非常不错
import java.awt.*; import javax.swing.*; import java.util.date; /*timedemo.java * @src public class timedemo extends jframe implements runnable { thread clock; public static void main(string[] args) { timedemo td =new timedemo(); td.setdefaultcloseoperation(jframe.exit_on_close); //点击可见窗口右上角的红叉关闭 } public timedemo(){ super("雪地漫步---java多线程数字时钟"); //继承父类构造方法,这里相当于font("雪地漫步---java多线程数字时钟"); settitle("kk"); //这个则是子类的 this.setfont(new font("times new roman",font.bold,60)); //设置字体大小 this.go(); //自定义go方法,用于以后开启线程 setbounds(400,300,300,100); this.setvisible(true); } public void go(){ stop(); if(clock==null){ //线程执行的主题作为thread类构造方法的参数。 clock=new thread(this); clock.start(); //开启线程,实现run方法 } } public void run() { while(true) //让线程一直进行 { //repain()方法是来控制graphics类的paint()方法的,repain()方法执行一次,即让paint()方法执行一次 repaint(); try{ thread.sleep(1000); //参数是毫秒,1秒即1000毫秒 }catch(interruptedexception e){} } } public void stop(){ clock=null; } public void paint(graphics g){ string s=""; date now=new date(); int hour=now.gethours(); int minute=now.getminutes(); int second=now.getseconds(); s=hour+":"+minute+":"+second; g.setcolor(color.green); dimension dim=getsize(); g.fillrect(0, 0, dim.width, dim.height); g.setcolor(color.red); g.drawstring(s, 20, 80); } }
例子三:思路更加的巧妙,分享给大家
import java.awt.borderlayout; import java.awt.canvas; import java.awt.color; import java.awt.font; import java.awt.graphics; import java.sql.date; import java.text.simpledateformat; import java.util.calendar; import javax.swing.jframe; import javax.swing.jpanel; class clock extends canvas implements runnable{ /* http://ohgrateboy.blog.163.com我的博客 */ private static final long serialversionuid = 3660124045489727166l; thread t; jframe frame=new jframe(); jpanel conpane; string time; int i=0; date timer; public clock(){ conpane=(jpanel)frame.getcontentpane(); conpane.setlayout(new borderlayout()); conpane.setsize(280,40); conpane.setbackground(color.white); conpane.add(this,borderlayout.center); t=new thread(this); //实例化线 t.start(); //调用线程 frame.setvisible(true); frame.setsize(300, 150); frame.setdefaultcloseoperation(jframe.exit_on_close); } public void run(){ while(true){ try{ thread.sleep(1000); //休眠1秒钟 }catch(interruptedexception e){ system.out.println("异常"); } this.repaint(100); } } public void paint(graphics g){ font f=new font("宋体",font.bold,16); simpledateformat sdf=new simpledateformat("yyyy'年'mm'月'dd'日'hh:mm:ss");//格式化时间显示类型 calendar now=calendar.getinstance(); time=sdf.format(now.gettime()); //得到当前日期和时间 g.setfont(f); g.setcolor(color.orange); g.drawstring(time,45,25); } public static void main(string args[]){ new clock(); } }