欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Java用戶界面本地化實(shí)例探索

系統(tǒng) 1835 0

  國(guó)際化是使程序具有足夠的靈活性、能在世界上任何地區(qū)運(yùn)行的過(guò)程。國(guó)際化所要求的必然結(jié)果是地方化――使一個(gè)程序能夠運(yùn)行在特定地區(qū)的過(guò)程。本文嘗試用一個(gè)簡(jiǎn)單的例子來(lái)演示Java用戶界面本地化。Java語(yǔ)言內(nèi)核基于Unicode3.0(Java 1.4)提供了對(duì)不同國(guó)家和不同語(yǔ)言文字的內(nèi)部支持,由于先天的原因,Java對(duì)于國(guó)際化的支持遠(yuǎn)遠(yuǎn)要比C/C++來(lái)的優(yōu)越。

  在我看來(lái)本地化必須滿足以下的三個(gè)條件:

  1、程序必須能讀、寫(xiě)和操作本地化的文本。

  2、程序在顯示日期和時(shí)間、使數(shù)字格式化以及排序子串時(shí),必須符合地方習(xí)慣。(通過(guò)java.text包里面的類(lèi)可以實(shí)現(xiàn)這些要求)

  3、所有用戶可見(jiàn)的文本都能在運(yùn)行時(shí)獲得,而不是直接寫(xiě)入程序中。(通過(guò)java.util包里的ResourceBundle類(lèi)和他的子類(lèi)可以實(shí)現(xiàn)這些要求。)

  實(shí)現(xiàn)這三個(gè)方面可以真正實(shí)現(xiàn)程序的國(guó)際化。

  首先讓我們來(lái)了解一下地區(qū)。地區(qū)代表一個(gè)地理上、政治上或文化上的區(qū)域。在Java中,地區(qū)由java.util.Locale類(lèi)表示。地區(qū)常常以一種語(yǔ)言來(lái)定義,該語(yǔ)言則由其標(biāo)準(zhǔn)的小寫(xiě)雙字母代碼表示。(例如:en代表英國(guó),fr代表法國(guó),zh代表中國(guó)),但有時(shí)候語(yǔ)言是不能代表一個(gè)地區(qū)的,那就要在語(yǔ)言后面再加上一個(gè)國(guó)家或該國(guó)家的地域(例如:en_US代表美國(guó),zh_TW)。Locale類(lèi)保存著一個(gè)靜態(tài)的默認(rèn)地區(qū),它可以用Locale.setDefault()和Locale.getDefault()來(lái)設(shè)置和查詢。一個(gè)程序可以生成和使用任意數(shù)目的非默認(rèn)Locale對(duì)象。

  讓我們?cè)賮?lái)看一下Unicode字符編碼。Java使用Unicode的字符編碼,其本身就是邁向國(guó)際化的一大步。Unicode編碼其每個(gè)字符都占兩個(gè)字節(jié)。用\u****的形式表示。Unicode的字符可以等價(jià)于其他編碼的字符(例如:從\u0020到\u007E的字符等價(jià)于ASCII和ISO8859-1字符的0x20到0x7E)。

  本文主要是對(duì)用戶界面地方化,由于我使用的是資源束!所以有必要對(duì)資源束作一下解釋。

  為定義一束地方化的資源,你需要生成一個(gè)ResourceBundle(資源束)的子類(lèi)并且提供handleGetObject()和getKeys()方法的定義。為了在程序中使用來(lái)自ResourceBundle的地方化資源,就需要先調(diào)用靜態(tài)的getBundle()方法,用getBundle()獲得一個(gè)ResourceBundle對(duì)象,然后再用getObject()方法去按照名字來(lái)查找資源。當(dāng)然也可以使用getString()簡(jiǎn)單的把getObject()的返回值分配給一個(gè)String對(duì)象。GetBundle()方法采用basename_language_country_variait----沒(méi)找到的話->basename_language_country----沒(méi)找到的話->basename_language----沒(méi)找到的話->basename(默認(rèn)資源文件)的算法尋找合適的資源。如果以上都沒(méi)找到的話,則會(huì)拋出一個(gè)MissingResourceException異常。

  現(xiàn)在我們來(lái)看一個(gè)簡(jiǎn)單的例子,如何使Java程序用戶界面地方化的。

  首先我們的程序需要查找特定Locale對(duì)象關(guān)聯(lián)的資源包,所以應(yīng)該定義一個(gè)Local對(duì)象,來(lái)獲取本地默認(rèn)的地區(qū)!然后可以調(diào)用ResourceBundle的getBundle方法,并將locale對(duì)象作為參數(shù)傳入。

  清單一:

Locale locale = Locale.getDefault(); //獲取地區(qū):默認(rèn)
//獲取資源束。如未發(fā)現(xiàn)則會(huì)拋出MissingResourceException異常
ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);


  清單一中的”P(pán)roperties.Dorian”代表Properties包下以Dorian命名的默認(rèn)資源文件。這樣就可以使用資源文件了!讓我們來(lái)看看資源文件是如何定義的。

  清單二:

# Dorian.properties是默認(rèn)的"Dorian"資源束文件。
# 作為中國(guó)人,我用自己的地區(qū)作為默認(rèn)

Title=\u4e2d\u56fd;
red.label=\u7ea2\u8272;
green.label=\u7eff\u8272;
blue.label=\u84dd\u8272;


  清單三:

# 文件Dorian_en_US.properties,是美國(guó)地區(qū)的資源束
# 它覆蓋了默認(rèn)資源束

Title=America;
red.label=Red;
green.label=Green;
blue.label=Blue ;


  清單一和二定義了一個(gè)默認(rèn)資源文件,和美國(guó)地區(qū)的資源文件。其中等號(hào)左邊的字符串表示主鍵,它們是唯一的。為了獲得主鍵對(duì)應(yīng)的值,你可以調(diào)用ResourceBundle類(lèi)的getString方法,并將主鍵作為參數(shù)。此外,文件中以“#”號(hào)開(kāi)頭的行表示注釋行。需要注意的是清單二中的“\u4e2d\u56fd”,它是字符“中國(guó)”的Unicode字符碼。是使用Java自帶的native2ascii工具轉(zhuǎn)換的(native2ascii in.properties out.properties),這是為了不在程序界面中產(chǎn)生亂碼。

  清單四:

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程序用戶界面的本地化就是這么簡(jiǎn)單。不過(guò),要提醒你的是在為用戶界面事件編寫(xiě)事件監(jiān)聽(tīng)器代碼時(shí),要格外小心。請(qǐng)看下面這段代碼。

  清單五:

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 ……
 }
}


   如果你對(duì)清單五的代碼不進(jìn)行本地化,她就可能會(huì)運(yùn)行的很好。但當(dāng)你的按鈕被本地化為中文時(shí),“Cancel”變?yōu)榱恕叭∠薄_@時(shí)就會(huì)出現(xiàn)你不愿意看到的問(wèn)題。下面有三個(gè)方法可以消除這個(gè)潛在的問(wèn)題!

  1> 使用內(nèi)部類(lèi)而不使用獨(dú)立的actionPerformed程序。

  2> 使用引號(hào)而不使用標(biāo)簽來(lái)標(biāo)識(shí)組件。

  3> 使用name屬性來(lái)標(biāo)識(shí)組件

  本例稍后的代碼就是采用第一種方法來(lái)消除這個(gè)問(wèn)題的。

  清單六:完整的代碼

//: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.*;

/**
這是一個(gè)將Java程序界面地方化的例子本例采用讀取屬性文件來(lái)達(dá)到目的
@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();//獲取地區(qū):默認(rèn)
  //獲取資源束。如未發(fā)現(xiàn)則會(huì)拋出MissingResourceException異常
  //"Properties.Dorian"為在Properties下以Dorian為文件名的默認(rèn)屬性文件
  ResourceBundle bundle = ResourceBundle.getBundle("Properties.Dorian",locale);
  setTitle(bundle.getString("Title"));//通過(guò)getString()的返回值來(lái)設(shè)置Title
  setSize(WIDTH,HEIGHT); // Set the window size.
  panel=new MyNativePanel();
  Container contentPane=getContentPane();
  contentPane.add(panel);

  //通過(guò)獲取資源束中*.label的值對(duì)三個(gè)按鈕設(shè)置其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);
  }
 });

 cmdGreen.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e){
   String s = e.getActionCommand();
   txt.setBackground(Color.green);
   txt.setText(s);
  }
 });
}

 public void setCmdRed(String s){
  cmdRed.setText(s);
 }

 public void setCmdBlue(String s){
  cmdBlue.setText(s);
 }

 public void setCmdGreen(String s){
  cmdGreen.setText(s);
 }

 JPanel panel=new JPanel();
 BorderLayout layout;
 private JTextField txt;
 private JButton cmdRed,cmdBlue,cmdGreen;
}
//~

  資源文件:

# Dorian.properties是默認(rèn)的"Dorian"資源束文件。
# 作為中國(guó)人,我用自己的地區(qū)作為默認(rèn)

Title=\u4e2d\u56fd
red.label=\u7ea2\u8272
green.label=\u7eff\u8272
blue.label=\u84dd\u8272

# 文件Dorian_en_US.properties,是美國(guó)地區(qū)的資源束
# 它覆蓋了默認(rèn)資源束
Title=America
red.label=Red
green.label=Green
blue.label=Blue
# 文件Dorian_zh_CN.properties,是中國(guó)大陸地區(qū)的資源束
# 這個(gè)文件沒(méi)有任何資源定義,從默認(rèn)中國(guó)資源束繼承

  以下是這個(gè)程序運(yùn)行后的截屏!




Java用戶界面本地化實(shí)例探索


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 在线观看av片 | 国产人成精品一区二区三 | 国产色 | 成人无码髙潮喷水A片 | 国产精品午夜电影 | 奇米777四色影视在线看 | 日韩免费一级片 | 亚洲欧美中文在线观看4 | 亚洲一区二区三区久久精品 | 亚洲综合色视频在线观看 | 久草福利在线视频 | 一区二区三区四区国产 | 9999网站| www.99b| 男女进进出出动态图啪啪 | 精品国产18久久久久久二百 | 免费欧美黄色 | 国产午夜精品理论片影院 | 91国在线啪 | 91精品国产免费久久久久久 | 49pao强力免费打造在线高清 | 人人九九精品 | 国产大伊香蕉精品视频 | 精品久久一区二区三区 | 久久久www成人免费精品 | 蜜桃日韩| 久久久久久黄 | 日本AAA片爽快视频 波多在线 | 日韩三区 | 国产大片线上免费看 | 亚洲精品不卡 | 欧美视频国产 | 久久久久久久99精品免费观看 | 天堂在线视频 | 欧美aⅴ片 | 久久国产免费福利永久 | 欧美成人精品欧美一级乱黄 | 日韩欧美一区二区三区在线视频 | av播放在线 | 欧美―第一页―浮力影院 | 国产在线欧美精品中文一区 |