📄 messageformatdemo.java
字号:
/* * @(#)MessageFormatDemo.java 1.1 96/11/23 * * (C) Copyright Taligent, Inc. 1996 - All Rights Reserved * (C) Copyright IBM Corp. 1996 - All Rights Reserved * * Portions copyright (c) 1996 Sun Microsystems, Inc. All Rights Reserved. * * The original version of this source code and documentation is copyrighted * and owned by Taligent, Inc., a wholly-owned subsidiary of IBM. These * materials are provided under terms of a License Agreement between Taligent * and Sun. This technology is protected by multiple US and International * patents. This notice and attribution to Taligent may not be removed. * Taligent is a registered trademark of Taligent, Inc. * * Permission to use, copy, modify, and distribute this software * and its documentation for NON-COMMERCIAL purposes and without * fee is hereby granted provided that this copyright notice * appears in all copies. Please refer to the file "copyright.html" * for further important copyright and licensing information. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. * */import java.applet.Applet;import java.awt.event.*;import java.awt.*;import java.util.*;import java.lang.*;import java.text.*;/** * <P> Pattern formats are used to put together sequences of strings, numbers, * dates, and other formats to create messages. The pattern formatters * facilitate localization because they prevent both hard-coding of message * strings, <I> and </I> hard-coding of the concatenation sequence for portions * of message strings. This means localizers can change the content, format, * and order of any text as appropriate for any language. * </P> * <P><CENTER> * <A HREF="#format">About the Pattern Format</A> * <A HREF="#arguments">Formatting Arguments</A><BR> * <A HREF="#choices">Supporting Multiple Choices</A> * </CENTER></P> * <HR> * <H3><A NAME="format">About the Pattern Format </A></H3> * <P> The pattern is a sequence of text and arguments, all of which can be * edited. The positions of the arguments within the sequence are indicated * by a "%" followed by a digit <I> n </I> identifying the * argument. The pattern in the demo applet has three arguments, numbered 0, * 1, and 2. The arguments can appear in any order within the sequence, which * can be edited and modified. * </P> * <TABLE WIDTH=100% CELLPADDING=5> * <TR> * <TH ALIGN=left VALIGN=bottom>To See This...</TH> * <TH ALIGN=left VALIGN=bottom>Do This...</TH> * </TR> * <TR> * <TD WIDTH=50% VALIGN=top> You can move arguments freely within the sequence * or delete arguments. You can also edit or translate any of the unformatted * text. * </TD> * <TD VALIGN=top> * <TABLE CELLSPACING=0 CELLPADDING=0> * <TR> * <TD WIDTH=10 VALIGN=top> 1. * </TD> * <TD> Move the string "on %2" from the end of the pattern to * the front and correct the capitalization * </TD> * </TR> * </TABLE> * </TD> * </TR> * <TD WIDTH=50% VALIGN=top> Translations are provided in the demo applet for * the G7 countries. * </TD> * <TD VALIGN=top> * <TABLE CELLSPACING=0 CELLPADDING=0> * <TR> * <TD WIDTH=10 VALIGN=top> 1. * </TD> * <TD> Pull down the Locale menu * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 2. * </TD> * <TD> Try several different locales with the up and down arrow keys (on * Windows) or the mouse button (on Macintosh) * </TD> * </TR> * </TABLE> * </TD> * </TR> * </TABLE> * <P><STRONG><I>Note:</I></STRONG> To add a real percentage character to the * pattern, enter "%%". * </P> * <HR WIDTH=50% ALIGN=left> * <H3><A NAME="arguments"> Formatting Arguments </A></H3> * <P> The arguments can be either simple text strings or formattable, * localizable objects. The pattern in the demo applet, for example, includes * a date, an unformatted string, and a more complex format called a <I> choice * </I> format (described below). You can edit these arguments at will. When * localizing, you can also select any format to be associated with an * argument. * </P> * <TABLE WIDTH=100% CELLPADDING=5> * <TR> * <TH ALIGN=left VALIGN=bottom>To See This... </TH> * <TH ALIGN=left VALIGN=bottom>Do This...</TH> * </TR> * <TR> * <TD WIDTH=50% VALIGN=top> You can modify the value of any argument. * </TD> * <TD VALIGN=top> * <TABLE CELLSPACING=0 CELLPADDING=0> * <TR> * <TD WIDTH=10 VALIGN=top> 1. * </TD> * <TD> Select the "3" in argument 2 and change it to another number * —the formatted date adjusts to the new value * </TD> * </TR> * </TABLE> * </TD> * </TR> * <TR> * <TD WIDTH=50% VALIGN=top> You can change the format of any argument, and can * specify "unformatted" arguments that are not localized. * </TD> * <TD VALIGN=top> * <TABLE CELLSPACING=0 CELLPADDING=0> * <TR> * <TD WIDTH=10 VALIGN=top> 1. * </TD> * <TD> Change the format type for argument 2 to <I> None </I> * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 2. * </TD> * <TD> Try different locales and notice that the date does not reformat for * different locales * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 3. * </TD> * <TD> Return the format back to <I>Date </I> and try different locales again. * The date reformats. * </TD> * </TR> * </TABLE> * </TD> * </TR> * </TABLE> * <HR WIDTH=50% ALIGN=left> * <H3> <A NAME="choices">Supporting Multiple Choices </A></H3> * <P> Choice formats, like that used for argument 0, let localizers create * more natural messages, avoiding phrases like "3 file(s)". As * shown here, the correct text can be chosen for different numbers. This * works even in more complicated contexts, such as Slavic languages which * have more than one plural format based on the number involved. A particular * choice is chosen based on the value of the argument, and each choice can be * edited individually. * </P> * <P> Look also at the format for the choice associated with values of 2 and * higher, "%0|3". The vertical bar indicates that the choice * uses the value for argument 0, but the format for argument 3 (in this case, * a Number). This allows for a degree of flexibility in using different * formats. * </P> * <TABLE WIDTH=100% CELLPADDING=5> * <TR> * <TH ALIGN=left VALIGN=bottom>To See This...</TH> * <TH ALIGN=left VALIGN=bottom>Do This... </TH> * </TR> * <TR> * <TD WIDTH=50% VALIGN=top> You can edit the value of any of the choice * options. * </TD> * <TD VALIGN=top> * <TABLE CELLSPACING=0 CELLPADDING=0> * <TR> * <TD WIDTH=10 VALIGN=top> 1. * </TD> * <TD> Select the Choice String "no files" and type in "not a * single file" * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 2. * </TD> * <TD> Select the value for argument 0 and type in "0" * </TD> * </TR> * </TABLE> * </TD> * </TR> * <TR> * <TD WIDTH=50% VALIGN=top> You can establish different choices for parameters * based on the value of an argument, so that strings are substituted that * agree numerically. * </TD> * <TD VALIGN=top> * <TABLE CELLSPACING=0 CELLPADDING=0> * <TR> * <TD WIDTH=10 VALIGN=top> 1. * </TD> * <TD> Select the value for argument 0 and type in "0", then replace * it with a "1", and then with a "2". The string changes * correspondingly. * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 2. * </TD> * <TD> Select argument 0 and return the value to "0". Choose the * French or German locale and notice that it makes correct substitutions in * any language. * </TD> * </TR> * </TABLE> * </TD> * </TR> * <TR> * <TD WIDTH=50% VALIGN=top> You can add as many alternatives as you need for * different value ranges. * </TD> * <TD VALIGN=top> * <TABLE CELLSPACING=0 CELLPADDING=0> * <TR> * <TD WIDTH=10 VALIGN=top> 1. * </TD> * <TD> Select the U.S. English locale * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 2. * </TD> * <TD> Select the empty choice value box (under the "2") and type * in "10" * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 3. * </TD> * <TD> Type in "many files" in the corresponding <I> Choice Strings * </I> field * </TD> * </TR> * <TR> * <TD WIDTH=10 VALIGN=top> 4. * </TD> * <TD> Enter a number larger than10 for the value of argument 0—" * many files" is substituted in the resulting message * </TD> * </TR> * </TABLE> * </TD> * </TR> * </TABLE> * <P> You can type in other text in the pattern, arguments, or choices fields * to see different formatting behaviors. Try it out! * </P> * @see java.util.Format * @see java.util.MessageFormat * @version 1.1 11/23/96 * @author Laura Werner, Mark Davis*/public class MessageFormatDemo extends DemoApplet{ /** * The main function which defines the behavior of the MessageFormatDemo * applet when an applet is started. */ public static void main(String argv[]) { DemoApplet.showDemo(new MessageFormatFrame(null)); } /** * This creates a MessageFormatFrame for the demo applet. */ public Frame createDemoFrame(DemoApplet applet) { return new MessageFormatFrame(applet); }}/** * A Frame is a top-level window with a title. The default layout for a frame * is BorderLayout. The MessageFormatFrame class defines the window layout of * MessageFormatDemo. */ class MessageFormatFrame extends Frame implements WindowListener, ItemListener, KeyListener { /** * Constructs a new MessageFormatFrame that is initially invisible. */ public MessageFormatFrame(DemoApplet applet) { super("Message Formatting Demo"); this.applet = applet; addWindowListener(this); init(); start(); } /** * Initializes the applet. You never need to call this directly, it * is called automatically by the system once the applet is created. */ public void init() { //Get all locales for debugging, but only get G7 locales for demos. if (DEBUG == true) locales = NumberFormat.getAvailableLocales(); else locales = Utility.getG7Locales(); buildGUI(); } /** * Called to start the applet. You never need to call this method * directly, it is called when the applet's document is visited. */ public void start() { // Stick some initial data into the controls.... arg1Text.setText("3"); arg1Type.select(CHOICE); arg2Text.setText("MyDisk"); arg2Type.select(NONE); arg3Text.setText("3 Mar 96"); arg3Type.select(DATE); arg4Text.setText(""); arg4Type.select(NUMBER); patternText.setText("The disk '%1' contained %0 on %2."); // Set up the choice format controls too choice1Num.setText("0"); choice2Num.setText("1"); choice3Num.setText("2"); resetFormat(); doFormatting(); } /** * Reset to the default message format using the ResourceBundle mechanism. * @see java.util.ResourceBundle * @see java.util.ListResourceBundle */ public void resetFormat() { Locale locale = locales[localeMenu.getSelectedIndex()]; ClassLoader classLoader = this.getClass().getClassLoader(); choice4Num.setText(""); choice4Text.setText(""); ResourceBundle choiceResources = ResourceBundle.getBundle("ChoiceResource", locale); patternText.setText(choiceResources.getString("patternText")); choice1Text.setText(choiceResources.getString("choice1")); choice2Text.setText(choiceResources.getString("choice2")); choice3Text.setText(choiceResources.getString("choice3")); } /** * Create a new format based on the selected type. For example, a new * format needs to be created if a different locale or format type is * selected. */ public Format createFormat(Choice typeMenu) { int type = typeMenu.getSelectedIndex(); Locale locale = locales[localeMenu.getSelectedIndex()]; Format result = null; if (type == NUMBER) { result = NumberFormat.getInstance(locale); } else if (type == DATE) { result = DateFormat.getDateInstance(DateFormat.DEFAULT, locale); } else if (type == CHOICE) { result = choiceFormat; // XXX } return result; } /** * Create a new format based on the selection changes and update the * output text area. */ public void doFormatting() { // Create a ChoiceFormat based on the settings in the choice field double[] limits = new double[4]; limits[0] = doubleValue(choice1Num.getText()); limits[1] = doubleValue(choice2Num.getText()); limits[2] = doubleValue(choice3Num.getText()); limits[3] = doubleValue(choice4Num.getText()); String[] choices = new String[4]; choices[0] = choice1Text.getText(); choices[1] = choice2Text.getText(); choices[2] = choice3Text.getText(); choices[3] = choice4Text.getText(); choiceFormat = new ChoiceFormat(limits, choices); // XXX // Create the individual formatters for the items in the pattern.... Format[] formats = new Format[4]; formats[0] = createFormat(arg1Type); formats[1] = createFormat(arg2Type); formats[2] = createFormat(arg3Type); formats[3] = createFormat(arg4Type); // Now create the Message Formatter itself MessageFormat format = new MessageFormat(patternText.getText()); // Create the array of objects to format.... Object[] objects = new Object[4]; objects[0] = createObject(arg1Type, arg1Text); objects[1] = createObject(arg2Type, arg2Text); objects[2] = createObject(arg3Type, arg3Text); objects[3] = createObject(arg4Type, arg4Text); String result = null; try { result = format.format(objects); } catch (Exception e) { errorText("format threw an exception: " + e.toString()); result = "ERROR"; } resultText.setText(result); } /* ItemListener method */ public void itemStateChanged(ItemEvent e) { if((e.getSource() == arg1Type) || (e.getSource() == arg2Type) || (e.getSource() == arg3Type) || (e.getSource() == arg4Type)) { doFormatting(); } else if (e.getSource() == localeMenu) { resetFormat(); doFormatting(); } } /* KeyListener methods */ public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { if ((e.getSource() == choice1Text) || (e.getSource() == choice2Text) || (e.getSource() == choice3Text) || (e.getSource() == choice4Text)) { e.consume();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -