<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    關于Java用戶界面本地化實例探索

    國際化是使程序具有足夠的靈活性、能在世界上任何地區運行的過程。國際化所要求的必然結果是地方化――使一個程序能夠運行在特定地區的過程。本文嘗試用一個簡單的例子來演示Java用戶界面本地化。Java語言內核基于Unicode3.0(Java 1.4)提供了對不同國家和不同語言文字的內部支持,由于先天的原因,Java對于國際化的支持遠遠要比C/C++來的優越。
      
      在我看來本地化必須滿足以下的三個條件:
      
      1、程序必須能讀、寫和操作本地化的文本。
      
      2、程序在顯示日期和時間、使數字格式化以及排序子串時,必須符合地方習慣。(通過java.text包里面的類可以實現這些要求)
      
      3、所有用戶可見的文本都能在運行時獲得,而不是直接寫入程序中。(通過java.util包里的ResourceBundle類和他的子類可以實現這些要求。)
      
      實現這三個方面可以真正實現程序的國際化。
      
      首先讓我們來了解一下地區。地區代表一個地理上、政治上或文化上的區域。在Java中,地區由java.util.Locale類表示。地區常常以一種語言來定義,該語言則由其標準的小寫雙字母代碼表示。(例如:en代表英國,fr代表法國,zh代表中國),但有時候語言是不能代表一個地區的,那就要在語言后面再加上一個國家或該國家的地域(例如:en_US代表美國,zh_TW)。Locale類保存著一個靜態的默認地區,它可以用Locale.setDefault()和Locale.getDefault()來設置和查詢。一個程序可以生成和使用任意數目的非默認Locale對象。
      
      讓我們再來看一下Unicode字符編碼。Java使用Unicode的字符編碼,其本身就是邁向國際化的一大步。Unicode編碼其每個字符都占兩個字節。用\u****的形式表示。Unicode的字符可以等價于其他編碼的字符(例如:從\u0020到\u007E的字符等價于ASCII和ISO8859-1字符的0x20到0x7E)。
      
      本文主要是對用戶界面地方化,由于我使用的是資源束!所以有必要對資源束作一下解釋。
      
      為定義一束地方化的資源,你需要生成一個ResourceBundle(資源束)的子類并且提供handleGetObject()和getKeys()方法的定義。為了在程序中使用來自ResourceBundle的地方化資源,就需要先調用靜態的getBundle()方法,用getBundle()獲得一個ResourceBundle對象,然后再用getObject()方法去按照名字來查找資源。當然也可以使用getString()簡單的把getObject()的返回值分配給一個String對象。GetBundle()方法采用basename_language_country_variait----沒找到的話->basename_language_country----沒找到的話->basename_language----沒找到的話->basename(默認資源文件)的算法尋找合適的資源。如果以上都沒找到的話,則會拋出一個MissingResourceException異常。
      
      現在我們來看一個簡單的例子,如何使Java程序用戶界面地方化的。
      
      首先我們的程序需要查找特定Locale對象關聯的資源包,所以應該定義一個Local對象,來獲取本地默認的地區!然后可以調用ResourceBundle的getBundle方法,并將locale對象作為參數傳入。
      
      清單一:
      
      Locale locale = Locale.getDefault(); //獲取地區:默認
      //獲取資源束。如未發現則會拋出MissingResourceException異常
      ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
      
      清單一中的”Properties.Dorian”代表Properties包下以Dorian命名的默認資源文件。這樣就可以使用資源文件了!讓我們來看看資源文件是如何定義的。
      
      清單二:
      
      # Dorian.properties是默認的"Dorian"資源束文件。
      # 作為中國人,我用自己的地區作為默認
      
      Title=\u4e2d\u56fd;
      red.label=\u7ea2\u8272;
      green.label=\u7eff\u8272;
      blue.label=\u84dd\u8272;
      
      清單三:
      
      # 文件Dorian_en_US.properties,是美國地區的資源束
      # 它覆蓋了默認資源束
      
      Title=America;
      red.label=Red;
      green.label=Green;
      blue.label=Blue ;
      
      清單一和二定義了一個默認資源文件,和美國地區的資源文件。其中等號左邊的字符串表示主鍵,它們是唯一的。為了獲得主鍵對應的值,你可以調用ResourceBundle類的getString方法,并將主鍵作為參數。此外,文件中以“#”號開頭的行表示注釋行。需要注意的是清單二中的“\u4e2d\u56fd”,它是字符“中國”的Unicode字符碼。是使用Java自帶的native2ascii工具轉換的(native2ascii in.properties out.properties),這是為了不在程序界面中產生亂碼。
      
      清單四:
      
      cmdRed.setText(bundle.getString("red.label"));
      cmdBlue.setText (bundle.getString("blue.label"));
      cmdGreen.setText (bundle.getString("green.label"));
      
      清單二中的cmdRed、cmdBlue、cmdGreen 為按鈕。bundle.getString("red.label")為得到資源文件中主鍵是red.label的值。
      
      好了到此為止Java程序用戶界面的本地化就是這么簡單。不過,要提醒你的是在為用戶界面事件編寫事件監聽器代碼時,要格外小心。請看下面這段代碼。
      
      清單五:
      
      public class MyApplet extends Japplet implements ActionListener{
      public void init(){
      JButton cancelButton=new JButton(“Cancel”);
      CancelButton.addActionListener(this);
      ...
      }
      
      public void actionPerformed(ActionEvent e){
      String s=e.getActionCommand();
      if(arg.equals(“Cancel”);
      doCancel();
      else ……
      }
      }
      
      如果你對清單五的代碼不進行本地化,她就可能會運行的很好。但當你的按鈕被本地化為中文時,“Cancel”變為了“取消”。這時就會出現你不愿意看到的問題。下面有三個方法可以消除這個潛在的問題!
      
      1> 使用內部類而不使用獨立的actionPerformed程序。
      
      2> 使用引號而不使用標簽來標識組件。
      
      3> 使用name屬性來標識組件
      
      本例稍后的代碼就是采用第一種方法來消除這個問題的。
      
      清單六:完整的代碼
      
      //:MyNative.java
      
      /**
      Copyright (c) 2003 Dorian. All rights reserved
      @(#)MyNative.java 2003-12-21
      @author Dorian
      @version 1.0.0
      visit http://www.Dorian.com/Java/
      */
      
      import java.awt.*;
      import java.awt.event.*;
      import javax.swing.*;
      import java.util.*;
      
      /**
      這是一個將Java程序界面地方化的例子本例采用讀取屬性文件來達到目的
      @see java.util.Locale;
      @see java.util.ResourceBundle;
      @see java.util.MissingResourceException;
      */
      
      public class MyNative{
      public static void main(String[] args){
      JFrame frame = new MyNativeFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setResizable(false);
      frame.setVisible(true); // Pop the window up.
      }
      }
      
      class MyNativeFrame extends JFrame{
      public MyNativeFrame(){
      Locale locale = Locale.getDefault();//獲取地區:默認
      //獲取資源束。如未發現則會拋出MissingResourceException異常
      //"Properties.Dorian"為在Properties下以Dorian為文件名的默認屬性文件
      ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
      setTitle(bundle.getString("Title"));//通過getString()的返回值來設置Title
      setSize(WIDTH,HEIGHT); // Set the window size.
      panel=new MyNativePanel();
      Container contentPane=getContentPane();
      contentPane.add(panel);
      
      //通過獲取資源束中*.label的值對三個按鈕設置其Label
      
      panel.setCmdRed(bundle.getString("red.label"));
      panel.setCmdBlue(bundle.getString("blue.label"));
      panel.setCmdGreen(bundle.getString("green.label"));
      }
      
      private MyNativePanel panel;
      private static final int WIDTH=400;
      private static final int HEIGHT=100;
      }
      
      class MyNativePanel extends JPanel{
      public MyNativePanel(){
      layout=new BorderLayout();
      setLayout(layout);
      
      txt=new JTextField(50);
      add(txt,layout.CENTER);
      cmdRed=new JButton();
      cmdBlue=new JButton();
      cmdGreen=new JButton();
      panel.add(cmdRed);
      panel.add(cmdBlue);
      panel.add(cmdGreen);
      add(panel,layout.SOUTH);
      cmdRed.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
      String s = e.getActionCommand();
      txt.setBackground(Color.red);
      txt.setText(s);
      }
      });
      
      cmdBlue.addActionListener(new ActionListener(){
      public void actionPerformed(ActionEvent e){
      String s = e.getActionCommand();
      txt.setBackground(Color.blue);
      txt.setText(s);
      }
      });

    posted on 2006-05-25 17:40 software5168 閱讀(367) 評論(1)  編輯  收藏

    評論

    # re: 關于Java用戶界面本地化實例探索 2006-05-25 18:44 pc

    http://www.kpwang.com/pc/view.jsp?board_id=1&article_id=20064615519 javaBean與EJB區別 http://www.kpwang.com/pc/view.jsp?board_id=1&article_id=200646151043 JavaBeans 程序開發從入門到精通教程 http://www.kpwang.com/pc/view.jsp?board_id=1&article_id=20064614542 Java實現ftp功能(源程序)  回復  更多評論   


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2006年5月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    導航

    統計

    常用鏈接

    留言簿(3)

    隨筆分類

    隨筆檔案

    收藏夾

    JAVA學習網站

    綜合

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 久久青草91免费观看| 久久久高清免费视频| 波霸在线精品视频免费观看| 久久精品国产影库免费看| 思思99re66在线精品免费观看| 亚洲国产成人五月综合网| 亚洲免费人成视频观看| 羞羞视频在线观看免费| 噼里啪啦电影在线观看免费高清 | 久久精品a一国产成人免费网站| 亚洲邪恶天堂影院在线观看| 相泽南亚洲一区二区在线播放| 久久w5ww成w人免费| 亚洲婷婷国产精品电影人久久| 亚洲五月丁香综合视频| 久久午夜免费鲁丝片| 久久精品国产精品亚洲蜜月| 欧洲美女大片免费播放器视频| 国产在线观看片a免费观看| 亚洲日韩AV一区二区三区中文 | 四虎最新永久免费视频| 亚洲色爱图小说专区| 18禁亚洲深夜福利人口| 亚洲国产婷婷香蕉久久久久久| 久久夜色精品国产噜噜亚洲a| 久久免费的精品国产V∧| 亚洲色偷偷偷鲁综合| 精品无码无人网站免费视频| 亚洲乱码在线播放| 国产一区二区三区无码免费| 亚洲人精品亚洲人成在线| 免费一级一片一毛片| 亚洲人av高清无码| 国产亚洲av人片在线观看| 一级做a爱过程免费视| 亚洲国产精品人人做人人爽| 在线观看免费视频一区| 亚洲精品自在在线观看| 青柠影视在线观看免费| 亚洲中文字幕无码一区| 日韩精品无码区免费专区|