Calendar, Date, Locale, TimeZone

     Java Source      Applet      Date    Calendar    Timezone    Locale

// Choose timezone and locale.  Watch the effect on
// various formats such as currency.
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import java.text.*;

class StringDisplay extends Canvas
{
   Image oi = null;
   Graphics og;
   
   FontMetrics fm;
   Font fnt = new Font("TimesRoman", Font.BOLD, 14);
   
   void drawString (String string, Locale place)
   {
      oi = createImage(this.getSize().width, this.getSize().height);
      og = oi.getGraphics();
      og.setFont(fnt);
      //fnt = new Font(Font.getFontName(place), Font.BOLD, 14);
      fm = getFontMetrics(fnt);
      int xstart = (this.getSize().width - fm.stringWidth(string))/2;
      int ystart = (this.getSize().height + fm.getHeight())/2;
      og.drawString(string, xstart, ystart);
      getGraphics().drawImage(oi, 0, 0, this);
   }
   
   public void paint (Graphics g)
   {
      if (oi != null) g.drawImage(oi, 0, 0, this);
   }
}

class TimeDisplay extends Frame
{
   Image oi = null;
   Graphics og;

   int w=0, h=0;
   boolean showing=false;
   FontMetrics fm;
   Font fnt = new Font("TimesRoman", Font.BOLD, 26);
   
   void setStatus (boolean v) { showing = v; }
   
   public void showDate(Calendar cal)
   {
      if (oi == null || (w != this.getSize().width && h != this.getSize().height))
      {
         oi = createImage(this.getSize().width, this.getSize().height);
         og = oi.getGraphics();
         og.setFont(fnt);
         fm = getFontMetrics(fnt);
      }
      String date = (cal.get(Calendar.MONTH)+1)+"/"+
                     cal.get(Calendar.DAY_OF_MONTH)+"/"+
                     cal.get(Calendar.YEAR)+"  "+
                     cal.get(Calendar.HOUR_OF_DAY)+":"+
                     cal.get(Calendar.MINUTE)+"."+
                     cal.get(Calendar.SECOND);
      int xstart = (this.getSize().width - fm.stringWidth(date))/2;
      int ystart = (this.getSize().height + fm.getHeight())/2;
      og.setColor(new Color(255,255,220));
      og.fillRect(0, 0, this.getSize().width, this.getSize().height);
      og.setColor(Color.red);
      og.drawString(date, xstart, ystart);
      getGraphics().drawImage(oi, 0, 0, this);
   }
   
   public void paint (Graphics g)
   {
      if (oi != null) g.drawImage(oi, 0, 0, this);
   }
}

public class Cal extends java.applet.Applet
                 implements Runnable, ItemListener
{
   StringDisplay country, language, currency, number, percent;
   Date date;
   TimeDisplay display;
   Thread runner;
   Calendar calendar = null;
   Locale locale[], place = null;
   TimeZone timezone = null;
   List loc_list, tz_list;
   
   public void init ()
   {
      setLayout(new BorderLayout());
      
      Panel p = new Panel();
      p.setLayout(new GridLayout(1,2,20,0));
      
      Panel q = new Panel();
      q.setLayout(new BorderLayout());
      
      Panel r = new Panel();
      r.setLayout(new GridLayout(6,1));
      r.add (country = new StringDisplay());
      r.add (new Label("Country",Label.CENTER));
      r.add (language = new StringDisplay());
      r.add (new Label("Language",Label.CENTER));
      q.add ("North", r);
      
      q.add ("Center", loc_list = new List(14));
      
      q.add ("South", new Label("Locales",Label.CENTER));
      p.add (q);
      
      locale = Calendar.getAvailableLocales();
      try
      {
         for (int i=0 ; ; i++) loc_list.add (String.valueOf(locale[i]));
      }
      catch (ArrayIndexOutOfBoundsException e) { }
      
      q = new Panel();
      q.setLayout(new BorderLayout());
      
      r = new Panel();
      r.setLayout(new GridLayout(6,1));
      r.add (currency = new StringDisplay());
      r.add (new Label("Currency",Label.CENTER));
      r.add (percent = new StringDisplay());
      r.add (new Label("Percent",Label.CENTER));
      r.add (number = new StringDisplay());
      r.add (new Label("Number", Label.CENTER));
      q.add ("North", r);
      
      q.add ("Center", tz_list = new List(5));
      
      q.add ("South", new Label("Timezones",Label.CENTER));
      p.add (q);
      
      String tz [] = TimeZone.getAvailableIDs();
      try
      {
         for (int i=0 ; ; i++) tz_list.add (tz[i]);
      }
      catch (ArrayIndexOutOfBoundsException e) { }
      add ("Center", p);
   }
   
   public void start ()
   {
      display = new TimeDisplay();
      display.setSize(300,100);
      loc_list.addItemListener(this);
      tz_list.addItemListener(this);
      runner = new Thread(this);
      runner.start();
   }
   
   public void run ()
   {
      while (true)
      {
         try {   runner.sleep(1000); } catch (Exception e) { }
         if (timezone != null && place != null)
         {
            calendar = Calendar.getInstance(timezone, place);
            if (!display.showing)
            {
               display.showing = true;
               display.show();
            }
            display.showDate(calendar);
         }
      }
   }
   
   public void stop ()
   {
      if (display != null) display.dispose();
   }

   public void itemStateChanged (ItemEvent e)
   {
      if (e.getSource() == loc_list)
      {
         place = locale[loc_list.getSelectedIndex()];
         country.drawString(place.getDisplayCountry(), place);
         language.drawString(place.getDisplayLanguage(), place);
         try
         {
            String cur = NumberFormat.getCurrencyInstance(place).format(100.00);
            String num = NumberFormat.getInstance(place).format(100.23);
            String per = NumberFormat.getPercentInstance(place).format(0.444);
            currency.drawString(cur, place);
            number.drawString(num, place);
            percent.drawString(per, place);
         }
         catch (NumberFormatException ex) { System.out.println(ex); }
      }
      else
      if (e.getSource() == tz_list)
      {
         timezone = TimeZone.getTimeZone(tz_list.getSelectedItem());
      }
   }
}