import java.applet.Applet; import java.awt.*; import java.lang.Math; class MerryXmas extends Canvas implements Runnable { Font font; FontMetrics fm; int fh; Thread worker; String message; Color color; boolean first; void randomColor() { int red, green, blue; do { red=(int)(Math.random()*256); green=(int)(Math.random()*256); blue=(int)(Math.random()*256); } while (red<128 && green<128 && blue<128); color=new Color(red,green,blue); } MerryXmas() { setBackground(new Color(64,64,64)); message="Merry Christmas!"; font=new java.awt.Font("Helvetica",Font.BOLD,24); fh=font.getSize(); resize(size().width,fh+6); randomColor(); first=true; } public void update(Graphics g) { g.setColor(color); g.setFont(font); if (first) { fm=g.getFontMetrics(); // resize(size().width,fh+fm.getMaxDescent()); first=false; } g.drawString(message,(size().width-fm.stringWidth(message))/2,fh); } public void run() { while (true) { randomColor(); repaint(); try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) {} } } public void start() { worker=new Thread(this); worker.start(); } public void stop() { worker.stop(); } } class XmasTree extends Canvas implements Runnable { Thread worker; double x, y; XmasTree() { setBackground(new Color(64,64,64)); x=0; y=0; } public void update(Graphics g) { int i, map, sx=0, sy=0, leaf=0; double w=size().width, h=size().height; g.setColor(Color.green); for (i=0; i<200; i++) { double nx, ny; map=(int)(Math.random()*7); switch (map) { case 0: nx=0; ny=0.1*y; leaf=0; break; case 1: nx=y*0.333; ny=x*0.333+0.11; leaf+=3; break; case 2: nx=-y*0.333; ny=x*0.333+0.1; leaf+=3; break; default: nx=0.9*x; ny=0.1+0.9*y; leaf++; break; } x=nx; y=ny; sx=(int)(0.5+w*(1.25*x+0.5)); sy=(int)(0.5+h*(1-1.1*y)); g.drawLine(sx,sy,sx,sy); } if (leaf>=6) { switch ((int)(Math.random()*4)) { case 0: g.setColor(Color.red); break; case 1: g.setColor(Color.blue); break; case 2: g.setColor(Color.white); break; case 3: default: g.setColor(Color.yellow); break; } g.fillOval(sx,sy,5,5); } } public void run() { while (true) { repaint(); try { Thread.currentThread().sleep(50); } catch (InterruptedException e) {} } } public void start() { worker=new Thread(this); worker.start(); } public void stop() { worker.stop(); } } public class HelloWorld extends Applet { MerryXmas message; XmasTree tree; public void init() { setBackground(new Color(64,64,64)); setLayout(new BorderLayout()); message=new MerryXmas(); tree=new XmasTree(); add("North",message); add("Center",tree); } public void start() { message.start(); tree.start(); } public void stop() { message.stop(); tree.stop(); } }