import java.applet.Applet; import java.awt.*; import java.util.StringTokenizer; /** * 記念日までのカウント・ダウン、記念日からのカウント・アップをするアプレット * @author せぎてつ * @version 1.01 */ public class CountDownUp extends Applet implements Runnable { protected static final int DAYS = 1, HMS = 2, DAYS_AND_HMS = 3; //private -> protected protected int displayStyle; //private -> protected protected CalcTimeDifference timeDifference; // private -> protected protected MediaTracker tracker; // private -> protected protected String imageDir; // private -> protected private Color bgColor = Color.white; protected Image digits[] = new Image[10]; // private -> protected protected Image beforeFrontImage, beforeEndImage; // private -> protected protected Image afterFrontImage, afterEndImage; // private -> protected protected Image middleImage, hourImage, minuteImage; // private -> protected private Image offScreenImage; private Graphics offScreenGraphics; private int imageWidth; private Thread thread; /* factory method */ protected CalcTimeDifference createCalcTimeDifference() { // private -> protected return new CalcTimeDifferenceJDK11(); } public void init() { setDisplayStyleParameter(); setMemorialTimeParameter(); setImageParameters(); setColorParameter(); offScreenImage = createImage(getSize().width, getSize().height); offScreenGraphics = offScreenImage.getGraphics(); } protected void setDisplayStyleParameter() { // private -> protected String s = getParameter("displayStyle"); if (s == null) { displayStyle = HMS; } else if (s.equalsIgnoreCase("DAYS")) { displayStyle = DAYS; } else if (s.equalsIgnoreCase("HMS")) { displayStyle = HMS; } else if (s.equalsIgnoreCase("DAYS_AND_HMS")) { displayStyle = DAYS_AND_HMS; } } private void setMemorialTimeParameter() { int year = 2000, month = 0, day = 1; int hour = 0, minute = 0, second = 0; String s = getParameter("memorialTime"); if (s != null) { StringTokenizer st = new StringTokenizer(s); if (st.countTokens() == 3 || st.countTokens() == 6) { try { year = Integer.parseInt(st.nextToken()); month = Integer.parseInt(st.nextToken()) - 1; day = Integer.parseInt(st.nextToken()); if (st.countTokens() == 3) { hour = Integer.parseInt(st.nextToken()); minute = Integer.parseInt(st.nextToken()); second = Integer.parseInt(st.nextToken()); } } catch (NumberFormatException e) { } } } timeDifference = createCalcTimeDifference(); timeDifference.setMemorialTime(year, month, day, hour, minute, second); } protected void setImageParameters() { // private -> protected tracker = new MediaTracker(this); imageDir = getParameter("imageDir"); for (int i = 0; i < 10; i++) { digits[i] = getImage(getDocumentBase(), imageDir + i + ".gif"); tracker.addImage(digits[i], 0); } if (displayStyle == HMS || displayStyle == DAYS_AND_HMS) { hourImage = setImage("hourImage"); minuteImage = setImage("minuteImage"); } if (displayStyle == DAYS_AND_HMS) { middleImage = setImage("middleImage"); } beforeFrontImage = setImage("beforeFrontImage"); beforeEndImage = setImage("beforeEndImage"); afterFrontImage = setImage("afterFrontImage"); afterEndImage = setImage("afterEndImage"); } /* paramName の値をファイル名として image を取得して返すメソッド */ protected Image setImage(String paramName) { // private -> protected String s = getParameter(paramName); if (s != null) { Image image = getImage(getDocumentBase(), imageDir + s); tracker.addImage(image, 1); return image; } else { return null; } } private void setColorParameter() { try { bgColor = new Color(Integer.parseInt(getParameter("bgColor"), 16)); setBackground(bgColor); } catch (NumberFormatException e) { } } public void paint(Graphics g) { if (tracker.checkAll()) { offScreenGraphics.setColor(bgColor); offScreenGraphics.fillRect(0, 0, getSize().width, getSize().height); imageWidth = 0; if (timeDifference.before()) { paintImage(beforeFrontImage); } else { paintImage(afterFrontImage); } paintDaysAndHMS(); // オーバーライドしやすいようにメソッドにまとめた if (timeDifference.before()) { paintImage(beforeEndImage); } else { paintImage(afterEndImage); } g.drawImage(offScreenImage, 0, 0, this); return; } else { g.setColor(Color.white); g.fillRect(0, 0, getSize().width, getSize().height); g.setColor(Color.black); g.drawString("Loading...", 0, 15); return; } } protected void paintDaysAndHMS() { // オーバーライドしやすいようにまとめられた部分 if (displayStyle == DAYS) { paintDiffDays(); } else if (displayStyle == HMS) { int num = timeDifference.getDiffDays(); num = num * 24 + timeDifference.getDiffHours(); paintDiffHMS(num, timeDifference.getDiffMinutes(), timeDifference.getDiffSeconds()); } else if (displayStyle == DAYS_AND_HMS) { paintDiffDays(); paintImage(middleImage); paintDiffHMS(timeDifference.getDiffHours(), timeDifference.getDiffMinutes(), timeDifference.getDiffSeconds()); } } protected void paintDiffDays() { // private -> protected String diffDays = String.valueOf(timeDifference.getDiffDays()); if (displayStyle == DAYS) { diffDays = String.valueOf(timeDifference.getDiffDays() + 1); } for (int i = 0; i < diffDays.length(); i++) { try { int num =Integer.parseInt(diffDays.substring(i, i + 1)); paintImage(digits[num]); } catch (NumberFormatException e1) { } catch (IndexOutOfBoundsException e2) { } } } protected void paintDiffHMS(int diffHours, int diffMinutes, int diffSeconds) { // private -> protected String s = String.valueOf(diffHours); for (int i = 0; i < s.length(); i++) { try { paintImage(digits[Integer.parseInt(s.substring(i, i + 1))]); } catch (NumberFormatException e1) { } catch (IndexOutOfBoundsException e2) { } } paintImage(hourImage); paintImage(digits[diffMinutes / 10]); paintImage(digits[diffMinutes % 10]); paintImage(minuteImage); paintImage(digits[diffSeconds / 10]); paintImage(digits[diffSeconds % 10]); } protected void paintImage(Image image) { // private -> protected if (image != null) { offScreenGraphics.drawImage(image, imageWidth, 0, this); imageWidth += image.getWidth(this); } } public void update(Graphics g) { paint(g); } public void run() { try { tracker.waitForAll(); } catch (InterruptedException e) { return; } while (true) { try { Thread.sleep(10); // sleep(250) -> sleep(10) } catch (InterruptedException e) { break; } setCurrentTime(); // オーバーライドする部分をメソッドに repaint(); } } protected void setCurrentTime() { timeDifference.setCurrentTime(); } public void start() { if (thread == null) { thread = new Thread(this); thread.start(); } } public void stop() { if (thread != null) { thread = null; } } }