This program demonstrates collating strings under various locales. : Locale « I18N « Java






This program demonstrates collating strings under various locales.

This program demonstrates collating strings 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.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

/**
 * This program demonstrates collating strings under various locales.
 * 
 * @version 1.13 2007-07-25
 * @author Cay Horstmann
 */
public class CollationTest {
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {

        JFrame frame = new CollationFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
      }
    });
  }
}

/**
 * This frame contains combo boxes to pick a locale, collation strength and
 * decomposition rules, a text field and button to add new strings, and a text
 * area to list the collated strings.
 */
class CollationFrame extends JFrame {
  public CollationFrame() {
    setTitle("CollationTest");

    setLayout(new GridBagLayout());
    add(new JLabel("Locale"), new GBC(0, 0).setAnchor(GBC.EAST));
    add(new JLabel("Strength"), new GBC(0, 1).setAnchor(GBC.EAST));
    add(new JLabel("Decomposition"), new GBC(0, 2).setAnchor(GBC.EAST));
    add(addButton, new GBC(0, 3).setAnchor(GBC.EAST));
    add(localeCombo, new GBC(1, 0).setAnchor(GBC.WEST));
    add(strengthCombo, new GBC(1, 1).setAnchor(GBC.WEST));
    add(decompositionCombo, new GBC(1, 2).setAnchor(GBC.WEST));
    add(newWord, new GBC(1, 3).setFill(GBC.HORIZONTAL));
    add(new JScrollPane(sortedWords), new GBC(0, 4, 2, 1).setFill(GBC.BOTH));

    locales = (Locale[]) Collator.getAvailableLocales().clone();
    Arrays.sort(locales, new Comparator<Locale>() {
      private Collator collator = Collator.getInstance(Locale.getDefault());

      public int compare(Locale l1, Locale l2) {
        return collator.compare(l1.getDisplayName(), l2.getDisplayName());
      }
    });
    for (Locale loc : locales)
      localeCombo.addItem(loc.getDisplayName());
    localeCombo.setSelectedItem(Locale.getDefault().getDisplayName());

    strings.add("America");
    strings.add("able");
    strings.add("Zulu");
    strings.add("zebra");
    strings.add("\u00C5ngstr\u00F6m");
    strings.add("A\u030angstro\u0308m");
    strings.add("Angstrom");
    strings.add("Able");
    strings.add("office");
    strings.add("o\uFB03ce");
    strings.add("Java\u2122");
    strings.add("JavaTM");
    updateDisplay();

    addButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        strings.add(newWord.getText());
        updateDisplay();
      }
    });

    ActionListener listener = new ActionListener() {
      public void actionPerformed(ActionEvent event) {
        updateDisplay();
      }
    };

    localeCombo.addActionListener(listener);
    strengthCombo.addActionListener(listener);
    decompositionCombo.addActionListener(listener);
    pack();
  }

  /**
   * Updates the display and collates the strings according to the user
   * settings.
   */
  public void updateDisplay() {
    Locale currentLocale = locales[localeCombo.getSelectedIndex()];
    localeCombo.setLocale(currentLocale);

    currentCollator = Collator.getInstance(currentLocale);
    currentCollator.setStrength(strengthCombo.getValue());
    currentCollator.setDecomposition(decompositionCombo.getValue());

    Collections.sort(strings, currentCollator);

    sortedWords.setText("");
    for (int i = 0; i < strings.size(); i++) {
      String s = strings.get(i);
      if (i > 0 && currentCollator.compare(s, strings.get(i - 1)) == 0)
        sortedWords.append("= ");
      sortedWords.append(s + "\n");
    }
    pack();
  }

  private List<String> strings = new ArrayList<String>();

  private Collator currentCollator;

  private Locale[] locales;

  private JComboBox localeCombo = new JComboBox();

  private EnumCombo strengthCombo = new EnumCombo(Collator.class, new String[] { "Primary",
      "Secondary", "Tertiary", "Identical" });

  private EnumCombo decompositionCombo = new EnumCombo(Collator.class, new String[] {
      "Canonical Decomposition", "Full Decomposition", "No Decomposition" });

  private JTextField newWord = new JTextField(20);

  private JTextArea sortedWords = new JTextArea(20, 20);

  private JButton addButton = new JButton("Add");
}

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

   
    
  








Related examples in the same category

1.List Locales from Locale.getAvailableLocales()List Locales from Locale.getAvailableLocales()
2.List all Locale from SimpleDateFormatList all Locale from SimpleDateFormat
3.Locale Constant
4.Country Language CodesCountry Language Codes
5.Get Days Of The Week for different localeGet Days Of The Week for different locale
6.Get Display Country for default localeGet Display Country for default locale
7.Get ISO3 Language for default localeGet ISO3 Language for default locale
8.Get Display Name for default localeGet Display Name for default locale
9.Get Display Variant for default localeGet Display Variant for default locale
10.Get the 2-letter country code; may be equal to ""
11.List Locale OrientationList Locale Orientation
12.Get localized name suitable for display to the user
13.Setting the Default Locale on the command line
14.Set language and country code on the command line
15.Change the default locale is to call Locale.setDefault():
16.Set the default locale to pre-defined locale
17.Set the default locale to custom locale
18.format date for a Locale
19.Get a list of country names
20.Set only language code on the command line
21.Set a default Locale
22.Disable localization
23.Set of convenience routines for internationalized code
24.Print the default locale
25.Change the default locale
26.iso639-2-language-code.csv
27.iso3166-country-codes.csv
28.Converts a String to a Locale
29.Converts the double value to locale-independent string representation
30.Calculate the postfix to append to a filename to load the correct single filename for that Locale.
31.Calculate the postfixes along the search path from the base bundle to the bundle specified by baseName and locale.
32.Concat postfix to the name. Take care of existing filename extension.
33.Convert a string based locale into a Locale Object
34.Obtains an unmodifiable set of installed locales.
35.Obtains the list of languages supported for a given country.
36.Obtains the list of locales to search through when performing a locale search.
37.Parse the given localeString into a java.util.Locale
38.Returns the parent locale of a given locale.
39.This program demonstrates formatting dates under various locales.This program demonstrates formatting dates under various locales.
40.This program demonstrates formatting numbers under various locales.This program demonstrates formatting numbers under various locales.
41.Builds a Locale instance from the passed string.
42.Utility class providing methods to access the Locale of the current thread and to get Localised strings.