Mega Code Archive

 
Categories / Java / Internationalization
 

This program demonstrates formatting dates under various locales

/*  This program is a part of the companion code for Core Java 8th ed.  (http://horstmann.com/corejava)  This program is free software: you can redistribute it and/or modify  it under the terms of the GNU General Public License as published by  the Free Software Foundation, either version 3 of the License, or  (at your option) any later version.  This program is distributed in the hope that it will be useful,  but WITHOUT ANY WARRANTY; without even the implied warranty of  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  GNU General Public License for more details.  You should have received a copy of the GNU General Public License  along with this program.  If not, see <http://www.gnu.org/licenses/>.  */ import java.awt.EventQueue; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.DateFormat; import java.text.ParseException; import java.util.Arrays; import java.util.Comparator; import java.util.Date; import java.util.Locale; import java.util.Map; import java.util.TreeMap; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JTextField; /**  * This program demonstrates formatting dates under various locales.  *   * @version 1.13 2007-07-25  * @author Cay Horstmann  */ public class DateFormatTest {   public static void main(String[] args) {     EventQueue.invokeLater(new Runnable() {       public void run() {         JFrame frame = new DateFormatFrame();         frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         frame.setVisible(true);       }     });   } } /**  * This frame contains combo boxes to pick a locale, date and time formats, text  * fields to display formatted date and time, buttons to parse the text field  * contents, and a "lenient" check box.  */ class DateFormatFrame extends JFrame {   public DateFormatFrame() {     setTitle("DateFormatTest");     setLayout(new GridBagLayout());     add(new JLabel("Locale"), new GBC(0, 0).setAnchor(GBC.EAST));     add(new JLabel("Date style"), new GBC(0, 1).setAnchor(GBC.EAST));     add(new JLabel("Time style"), new GBC(2, 1).setAnchor(GBC.EAST));     add(new JLabel("Date"), new GBC(0, 2).setAnchor(GBC.EAST));     add(new JLabel("Time"), new GBC(0, 3).setAnchor(GBC.EAST));     add(localeCombo, new GBC(1, 0, 2, 1).setAnchor(GBC.WEST));     add(dateStyleCombo, new GBC(1, 1).setAnchor(GBC.WEST));     add(timeStyleCombo, new GBC(3, 1).setAnchor(GBC.WEST));     add(dateParseButton, new GBC(3, 2).setAnchor(GBC.WEST));     add(timeParseButton, new GBC(3, 3).setAnchor(GBC.WEST));     add(lenientCheckbox, new GBC(0, 4, 2, 1).setAnchor(GBC.WEST));     add(dateText, new GBC(1, 2, 2, 1).setFill(GBC.HORIZONTAL));     add(timeText, new GBC(1, 3, 2, 1).setFill(GBC.HORIZONTAL));     locales = (Locale[]) DateFormat.getAvailableLocales().clone();     Arrays.sort(locales, new Comparator<Locale>() {       public int compare(Locale l1, Locale l2) {         return l1.getDisplayName().compareTo(l2.getDisplayName());       }     });     for (Locale loc : locales)       localeCombo.addItem(loc.getDisplayName());     localeCombo.setSelectedItem(Locale.getDefault().getDisplayName());     currentDate = new Date();     currentTime = new Date();     updateDisplay();     ActionListener listener = new ActionListener() {       public void actionPerformed(ActionEvent event) {         updateDisplay();       }     };     localeCombo.addActionListener(listener);     dateStyleCombo.addActionListener(listener);     timeStyleCombo.addActionListener(listener);     dateParseButton.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent event) {         String d = dateText.getText().trim();         try {           currentDateFormat.setLenient(lenientCheckbox.isSelected());           Date date = currentDateFormat.parse(d);           currentDate = date;           updateDisplay();         } catch (ParseException e) {           dateText.setText("Parse error: " + d);         } catch (IllegalArgumentException e) {           dateText.setText("Argument error: " + d);         }       }     });     timeParseButton.addActionListener(new ActionListener() {       public void actionPerformed(ActionEvent event) {         String t = timeText.getText().trim();         try {           currentDateFormat.setLenient(lenientCheckbox.isSelected());           Date date = currentTimeFormat.parse(t);           currentTime = date;           updateDisplay();         } catch (ParseException e) {           timeText.setText("Parse error: " + t);         } catch (IllegalArgumentException e) {           timeText.setText("Argument error: " + t);         }       }     });     pack();   }   /**    * Updates the display and formats the date according to the user settings.    */   public void updateDisplay() {     Locale currentLocale = locales[localeCombo.getSelectedIndex()];     int dateStyle = dateStyleCombo.getValue();     currentDateFormat = DateFormat.getDateInstance(dateStyle, currentLocale);     String d = currentDateFormat.format(currentDate);     dateText.setText(d);     int timeStyle = timeStyleCombo.getValue();     currentTimeFormat = DateFormat.getTimeInstance(timeStyle, currentLocale);     String t = currentTimeFormat.format(currentTime);     timeText.setText(t);   }   private Locale[] locales;   private Date currentDate;   private Date currentTime;   private DateFormat currentDateFormat;   private DateFormat currentTimeFormat;   private JComboBox localeCombo = new JComboBox();   private EnumCombo dateStyleCombo = new EnumCombo(DateFormat.class, new String[] { "Default",       "Full", "Long", "Medium", "Short" });   private EnumCombo timeStyleCombo = new EnumCombo(DateFormat.class, new String[] { "Default",       "Full", "Long", "Medium", "Short" });   private JButton dateParseButton = new JButton("Parse date");   private JButton timeParseButton = new JButton("Parse time");   private JTextField dateText = new JTextField(30);   private JTextField timeText = new JTextField(30);   private JCheckBox lenientCheckbox = new JCheckBox("Parse lenient", true); } /*  * This program is a part of the companion code for Core Java 8th ed.  * (http://horstmann.com/corejava)  *   * This program is free software: you can redistribute it and/or modify it under  * the terms of the GNU General Public License as published by the Free Software  * Foundation, either version 3 of the License, or (at your option) any later  * version.  *   * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  * details.  *   * You should have received a copy of the GNU General Public License along with  * this program. If not, see <http://www.gnu.org/licenses/>.  */ /*  * GBC - A convenience class to tame the GridBagLayout  *   * Copyright (C) 2002 Cay S. Horstmann (http://horstmann.com)  *   * This program is free software; you can redistribute it and/or modify it under  * the terms of the GNU General Public License as published by the Free Software  * Foundation; either version 2 of the License, or (at your option) any later  * version.  *   * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  * details.  *   * You should have received a copy of the GNU General Public License along with  * this program; if not, write to the Free Software Foundation, Inc., 59 Temple  * Place, Suite 330, Boston, MA 02111-1307 USA  */ /**  * This class simplifies the use of the GridBagConstraints class.  */ class GBC extends GridBagConstraints {   /**    * Constructs a GBC with a given gridx and gridy position and all other grid    * bag constraint values set to the default.    *     * @param gridx    *          the gridx position    * @param gridy    *          the gridy position    */   public GBC(int gridx, int gridy) {     this.gridx = gridx;     this.gridy = gridy;   }   /**    * Constructs a GBC with given gridx, gridy, gridwidth, gridheight and all    * other grid bag constraint values set to the default.    *     * @param gridx    *          the gridx position    * @param gridy    *          the gridy position    * @param gridwidth    *          the cell span in x-direction    * @param gridheight    *          the cell span in y-direction    */   public GBC(int gridx, int gridy, int gridwidth, int gridheight) {     this.gridx = gridx;     this.gridy = gridy;     this.gridwidth = gridwidth;     this.gridheight = gridheight;   }   /**    * Sets the anchor.    *     * @param anchor    *          the anchor value    * @return this object for further modification    */   public GBC setAnchor(int anchor) {     this.anchor = anchor;     return this;   }   /**    * Sets the fill direction.    *     * @param fill    *          the fill direction    * @return this object for further modification    */   public GBC setFill(int fill) {     this.fill = fill;     return this;   }   /**    * Sets the cell weights.    *     * @param weightx    *          the cell weight in x-direction    * @param weighty    *          the cell weight in y-direction    * @return this object for further modification    */   public GBC setWeight(double weightx, double weighty) {     this.weightx = weightx;     this.weighty = weighty;     return this;   }   /**    * Sets the insets of this cell.    *     * @param distance    *          the spacing to use in all directions    * @return this object for further modification    */   public GBC setInsets(int distance) {     this.insets = new Insets(distance, distance, distance, distance);     return this;   }   /**    * Sets the insets of this cell.    *     * @param top    *          the spacing to use on top    * @param left    *          the spacing to use to the left    * @param bottom    *          the spacing to use on the bottom    * @param right    *          the spacing to use to the right    * @return this object for further modification    */   public GBC setInsets(int top, int left, int bottom, int right) {     this.insets = new Insets(top, left, bottom, right);     return this;   }   /**    * Sets the internal padding    *     * @param ipadx    *          the internal padding in x-direction    * @param ipady    *          the internal padding in y-direction    * @return this object for further modification    */   public GBC setIpad(int ipadx, int ipady) {     this.ipadx = ipadx;     this.ipady = ipady;     return this;   } } /*  * This program is a part of the companion code for Core Java 8th ed.  * (http://horstmann.com/corejava)  *   * This program is free software: you can redistribute it and/or modify it under  * the terms of the GNU General Public License as published by the Free Software  * Foundation, either version 3 of the License, or (at your option) any later  * version.  *   * This program is distributed in the hope that it will be useful, but WITHOUT  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS  * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more  * details.  *   * You should have received a copy of the GNU General Public License along with  * this program. If not, see <http://www.gnu.org/licenses/>.  */ /**  * A combo box that lets users choose from among static field values whose names  * are given in the constructor.  *   * @version 1.13 2007-07-25  * @author Cay Horstmann  */ class EnumCombo extends JComboBox {   /**    * Constructs an EnumCombo.    *     * @param cl    *          a class    * @param labels    *          an array of static field names of cl    */   public EnumCombo(Class<?> cl, String[] labels) {     for (String label : labels) {       String name = label.toUpperCase().replace(' ', '_');       int value = 0;       try {         java.lang.reflect.Field f = cl.getField(name);         value = f.getInt(cl);       } catch (Exception e) {         label = "(" + label + ")";       }       table.put(label, value);       addItem(label);     }     setSelectedItem(labels[0]);   }   /**    * Returns the value of the field that the user selected.    *     * @return the static field value    */   public int getValue() {     return table.get(getSelectedItem());   }   private Map<String, Integer> table = new TreeMap<String, Integer>(); }