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>(); }