import java.applet.Applet; import java.awt.*; import java.util.Calendar; public class DigitalClock extends Applet implements Runnable{ private Calendar currentTime; private Thread thread; private Image digits[] = new Image[13]; private boolean isAMPM; private MediaTracker tracker; private Image offScreenImage; private Graphics offScreenGraphics; public void init() { currentTime = Calendar.getInstance(); tracker = new MediaTracker(this); String imageDir = getParameter("imagedir"); for (int i = 0; i < 10; i++) { digits[i] = getImage(getDocumentBase(), imageDir + i + ".gif"); tracker.addImage(digits[i], 0); } digits[10] = getImage(getDocumentBase(), imageDir + "C.gif"); tracker.addImage(digits[10], 0); try { setBackground(new Color(Integer.parseInt(getParameter("bgcolor"), 16))); } catch (NumberFormatException e) { } isAMPM = (getParameter("am_pm") != null) ? true : false; if (isAMPM) { digits[11] = getImage(getDocumentBase(), imageDir + "A.gif"); digits[12] = getImage(getDocumentBase(), imageDir + "P.gif"); tracker.addImage(digits[11], 1); tracker.addImage(digits[12], 1); } offScreenImage = createImage(getSize().width, getSize().height); offScreenGraphics = offScreenImage.getGraphics(); } public void paint(Graphics g) { if (tracker.isErrorID(0)) { offScreenGraphics.setColor(Color.white); offScreenGraphics.fillRect(0, 0, getSize().width, getSize().height); String timeString = currentTime.get(Calendar.HOUR) + " : " + currentTime.get(Calendar.MINUTE) + " : " + currentTime.get(Calendar.SECOND); offScreenGraphics.setColor(Color.black); offScreenGraphics.drawString(timeString, 0, 15); g.drawImage(offScreenImage, 0, 0, this); showStatus("Applet DigitaClock can't find image files."); return; } if (tracker.checkAll()) { int imageWidth = 0; int hour24 = currentTime.get(Calendar.HOUR); if (!isAMPM && currentTime.get(Calendar.AM_PM) == 1) { hour24 += 12; } if (isAMPM && !tracker.isErrorID(1)) { offScreenGraphics.drawImage(digits[(currentTime.get(Calendar.AM_PM) == 0) ? 11 : 12], imageWidth, 0, this); imageWidth += digits[(currentTime.get(Calendar.AM_PM) == 0) ? 11 : 12].getWidth(this); } offScreenGraphics.drawImage(digits[hour24 / 10], imageWidth, 0, this); imageWidth += digits[hour24 / 10].getWidth(this); offScreenGraphics.drawImage(digits[hour24 % 10], imageWidth, 0, this); imageWidth += digits[hour24 % 10].getWidth(this); offScreenGraphics.drawImage(digits[10], imageWidth, 0, this); imageWidth += digits[10].getWidth(this); offScreenGraphics.drawImage(digits[currentTime.get(Calendar.MINUTE) / 10], imageWidth, 0, this); imageWidth += digits[currentTime.get(Calendar.MINUTE) / 10].getWidth(this); offScreenGraphics.drawImage(digits[currentTime.get(Calendar.MINUTE) % 10], imageWidth, 0, this); imageWidth += digits[currentTime.get(Calendar.MINUTE) % 10].getWidth(this); offScreenGraphics.drawImage(digits[10], imageWidth, 0, this); imageWidth += digits[10].getWidth(this); offScreenGraphics.drawImage(digits[currentTime.get(Calendar.SECOND) / 10], imageWidth, 0, this); imageWidth += digits[currentTime.get(Calendar.SECOND) / 10].getWidth(this); offScreenGraphics.drawImage(digits[currentTime.get(Calendar.SECOND) % 10], imageWidth, 0, this); g.drawImage(offScreenImage, 0, 0, this); } else { g.setColor(Color.white); g.fillRect(0, 0, getSize().width, getSize().height); g.setColor(Color.black); g.drawString("Loading...", 0, 15); return; } } public void update(Graphics g) { paint(g); } public void run() { try { tracker.waitForAll(); } catch (InterruptedException e) { return; } while (true) { try { Thread.sleep(500); } catch (InterruptedException e) { break; } currentTime = Calendar.getInstance(); repaint(); } } public void start() { if (thread == null) { thread = new Thread(this); thread.start(); } } public void stop() { if (thread != null) { thread = null; } } }